• 点与线段的关系


    点与线段的关系
    难度:白银
    时间限制:1秒
    巴占用内存:64M
    输入线段的2个端点的坐标值和y,再输入第3个点的坐标,判断点在不在线段
    上,输出YES或者NO。

    1. #include
    2. using namespace std;
    3. int main(){
    4. int x1,y1,x2,y2,a,b;
    5. scanf("(%d,%d) (%d,%d)\n",&x1,&y1,&x2,&y2);
    6. scanf("(%d,%d)",&a,&b);
    7. double ans = sqrt(pow((x1-x2),2.0)+pow((y1-y2),2.0));
    8. double ans1 = sqrt(pow((a-x2),2.0)+pow((b-y2),2.0));
    9. double ans2 = sqrt(pow((x1-a),2.0)+pow((y1-b),2.0));
    10. if (ans == ans1 +ans2) cout <<"YES";
    11. else cout <<"NO";
    12. return 0;
    13. }

     

    最开始还审错题目含义了,以为是是否在这条直线上,大意了,没有闪,而且还就一个样例没有通过。

    之后,看到是线段从新来了一下,结果检查不出错误,之后发现是输入那里空格没有注意到,哎呀,我真是服了呀。

    下面是求是否在直线的,想要的要走吧。

    1. #include
    2. using namespace std;
    3. int main( )
    4. {
    5.     int a,b,c,d;
    6.     scanf("(%d,%d) (%d,%d)",&a,&b,&c,&d);
    7.     int e,f;
    8.     scanf("(%d,%d)",&e,&f);
    9.     double k;
    10.     k = (b-d)/((a-c)*1.0);
    11.     double i,j;
    12.     i = k*(c-a) + b;
    13.     j = k*(e-a) + f;
    14.     if(i == j){
    15.         cout<<"YES";
    16.     }else{
    17.         cout<<"NO";
    18.     }
    19.     return 0;
    20. }

    已知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 浮点数转整数的宏 实现

  • 相关阅读:
    Flutter循序渐进==>数据结构(列表、映射和集合)和错误处理
    虚拟DOM的发展趋势和潜在创新
    Jenkins实现-sonarqbue 代码质量检测CI部署
    华为如何建立“以项目为中心”的运作体系?华为项目经理就是CEO
    首发 自媒体博客最新版Spimes主题 X6.0开心免授权
    JavaScript数据结构与算法-排序全详解
    ai剪辑矩阵系统源码+无人直播系统源码技术开发
    Dock搭建FTP文件服务器
    如何判断一个程序是 32bit 还是 64bit ?
    企业管理论文题目怎么写?
  • 原文地址:https://blog.csdn.net/m0_62574889/article/details/127700925