点与线段的关系
难度:白银
时间限制:1秒
巴占用内存:64M
输入线段的2个端点的坐标值和y,再输入第3个点的坐标,判断点在不在线段
上,输出YES或者NO。
- #include
- using namespace std;
- int main(){
- int x1,y1,x2,y2,a,b;
- scanf("(%d,%d) (%d,%d)\n",&x1,&y1,&x2,&y2);
- scanf("(%d,%d)",&a,&b);
- double ans = sqrt(pow((x1-x2),2.0)+pow((y1-y2),2.0));
- double ans1 = sqrt(pow((a-x2),2.0)+pow((b-y2),2.0));
- double ans2 = sqrt(pow((x1-a),2.0)+pow((y1-b),2.0));
- if (ans == ans1 +ans2) cout <<"YES";
- else cout <<"NO";
- return 0;
- }
最开始还审错题目含义了,以为是是否在这条直线上,大意了,没有闪,而且还就一个样例没有通过。
之后,看到是线段从新来了一下,结果检查不出错误,之后发现是输入那里空格没有注意到,哎呀,我真是服了呀。
下面是求是否在直线的,想要的要走吧。
- #include
-
- using namespace std;
-
- int main( )
- {
- int a,b,c,d;
- scanf("(%d,%d) (%d,%d)",&a,&b,&c,&d);
- int e,f;
- scanf("(%d,%d)",&e,&f);
- double k;
- k = (b-d)/((a-c)*1.0);
- double i,j;
- i = k*(c-a) + b;
- j = k*(e-a) + f;
- if(i == j){
- cout<<"YES";
- }else{
- cout<<"NO";
- }
- return 0;
- }
已知2点的坐标。可以求得该两点的直线。
把第三个点代入这直线,如果满足,则在这直线上。不满足就不在了。
2.1.1 生成直线的DDA 算法
数值微分法即DDA 法(Digital Differential Analyzer),是一种基于直线的微分方程来生成直线的方法。
一、直线DDA 算法描述:
设(x1,y 1) 和(x2,y 2) 分别为所求直线的起点和终点坐标,由直线的微分方程得
可通过计算由x 方向的增量△x 引起y 的改变来生成直线:
也可通过计算由y 方向的增量△y 引起x
的改变来生成直线:
式(2-2) 至(2-5) 是递推的。
二、直线DDA 算法思想:
选定x 2-x 1和y 2-y 1中较大者作为步进方向(假设x 2-x 1较大) ,取该方向上的增量为一个象素单位(△x=1),然后利用式(2-1) 计算另一个方向的增量(△y=△x ·m=m)。通过递推公式(2-2) 至(2-5) ,把每次计算出的(xi+1,y i+1) 经取整后送到显示器输出,则得到扫描转换后的直线。 之所以取x 2-x 1和y 2-y 1中较大者作为步进方向,是考虑沿着线段分布的象素应均匀,这在下图中可看出。
另外,算法实现中还应注意直线的生成方向,以决定Δx 及Δy 是取正值还是负值。
三、直线DDA 算法实现:
1、已知直线的两端点坐标:(x1,y1) ,(x2,y2) 2、已知画线的颜色:color
3、计算两个方向的变化量:dx=x2-x1 dy=y2-y1 4、求出两个方向最大变化量的绝对值:
steps=max(|dx|,|dy|) 5、计算两个方向的增量(考虑了生成方向) : xin=dx/steps
yin=dy/steps 6、设置初始象素坐标:x=x1,y=y1 7、用循环实现直线的绘制: for(i=1;i
{ putpixel(x,y ,color) ;/*在(x,y) 处,以color 色画点*/ x=x+xin; y=y+yin; }
五、直线DDA 算法特点:
该算法简单,实现容易,但由于在循环中涉及实型数的运算,因此生成直线的速度较慢。 //@brief 浮点数转整数的宏 实现