点与线段的关系

点与线段的关系
难度:白银
时间限制: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 浮点数转整数的宏 实现

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值