• 算法导论之计算几何学小记 33.1


    在USACO上做题时发现要判断两线段是否相交,表示不会,别人说算导上就有,于是找来看看

    第一节主要3个小问题

    1.有向线段p0p1,p0p2,如何判断p0p1在p0p2的顺时针还是逆时针

    方法叉积

    (p1-p0)x(p2-p0)=(x1-x0)(y2-y0)-(x2-x0)(y1-y0)

    若>0,p0p1在p0p2的顺时针.<0则逆 ==0则共线...

    2.p0-p1 ,p1-p2,如何判断p1-p2是向左转还是右转

    还是采用上面的方法,不过判断的是p0p1-p0p2 (将p0p2连起来)

    3.判断两线段是否相交。

    思路是跨立测试,名字其实一看就懂,还是我脑子太麻木,我想一条线段能跨立另一条的直线(及一个点在逆时针,一个顺时针)不能表示一定相交啊,

    那就反过来再来一次啊....

     1 struct node
     2 {
     3     int x,y;
     4 };
     5 
     6 bool segment-intersect(node n1,node n2,node,n3,node n4)
     7 {
     8     int d1=direction(n1,n2,n3);
     9     int d2=direction(n1,n2,n4);
    10     int d3=direction(n3,n4,n1);
    11     int d4=direction(n3,n4,n2);
    12 
    13     if((d1>0&&d2<0)||(d1<0&&d2>0)&&
    14         ((d3>0&&d4<0)||(d3<0&&d4>0)))
    15         return true;
    16     //不考虑点在线段上的情况
    17     return false;
    18 
    19 }
    20 
    21 
    22 int direction(node ns,node n1,node n2)
    23 {
    24     int x1=n1.x-ns.x;
    25     int y1=n1.y-ns.y;
    26     int x2=n2.x-ns.x;
    27     int y2=n2.y-ns.y;
    28 
    29     return x1*y2-x2*y1;
    30 }

        

  • 相关阅读:
    第一行代码读书规划
    drawable文件夹详解
    index.do为后缀的是什么开发语言? 有什么技术特点?
    Activity与Fragment的生命周期
    正则例六
    iOS开发之--NSNotificationCenter的使用
    iOS开发之--MVC 架构模式
    iOS开发之--使用storyboard进行跳转
    swift
    iOS开发之-- oc 和 swift混编之自建桥接文件
  • 原文地址:https://www.cnblogs.com/cavehubiao/p/3379468.html
Copyright © 2020-2023  润新知