• 点与线段的关系


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

  • 相关阅读:
    HTML5期末大作业:基于HTML+CSS+JavaScript校园文化企业网站模板【学生网页设计作业源码】
    博客生涯的反思
    Dubbo的优雅下线原理分析
    Element-ui配合vue上传图片
    深度学习准召
    【Silvaco example】GaN diode, Reverse-bias leakage current vs temperature
    大模型从入门到应用——LangChain:代理(Agents)-[工具(Tools):人工确认工具验证和Tools作为OpenAI函数]
    SpringBoot学习笔记(五)IOC
    计算机毕业设计springboot+vue基本微信小程序的大学生竞赛信息发布与报名小程序
    文件管理功能重构,MeterSphere开源持续测试平台v2.1.0发布
  • 原文地址:https://blog.csdn.net/m0_62574889/article/details/127700925