点与线段的关系
点与线段的关系
难度:白银
时间限制:1秒
巴占用内存:64M
输入线段的2个端点的坐标值和y,再输入第3个点的坐标,判断点在不在线段
上,输出YES或者NO。
#include <bits/stdc++.h>
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<bits/stdc++.h>
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 浮点数转整数的宏 实现
Rsvip: 大模型生成的吗
堇羊: 这是知乎AI课程哪一期的?
夏北先森: 你好,其他题答案呢
咻咻咻383: 小马哥爱数字也过不去
咻咻咻383: 数列分段过不去