• 判断线段相交 -- 51nod 1264 线段相交


    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1264

    三角形的有向面积:a.x*b.y+b.x*c.y+c.x*a.y - a.x*c.y - c.x*b.y - b.x*a.y;

    上面得到的即是以点A,B,C三点组成的三角形面积的两倍。

    如果area >0 则点A,B,C呈逆时针排列。

    如果area<0  则点A,B,C呈顺时针排列。

    如果area=0  则点A,B,C三点共线。

    那么判断线段1(两个端点point a,b),与线段二是否相交(两个端点point c,d) 只要求 a,b,c与a,b,d的有向面积乘积是否小于0 ,并且c,d,a与c,d,b的有向面积是否小于0即可。

    只有两线段相交,有向面积才会是一个为正一个为负。画一下图就知道了。

    端点相交时乘积等于0。

     1 #include <cstdio>
     2 
     3 struct point
     4 {
     5     double x,y;
     6 };
     7 double dir(point a, point b, point c)//三角形有向面积判断顺逆时针
     8 {
     9     return a.x*b.y + b.x*c.y + c.x*a.y - a.x*c.y - c.x*b.y - b.x*a.y;
    10 }
    11 bool connected(point a, point b, point c, point d)//线段判交
    12 {
    13     if (dir(a, b, c)*dir(a, b, d) <= 0 && dir(d, c, a)*dir(d, c, b) <= 0)return 1;//注意在端点处相交时等于0
    14     return 0;
    15 }
    16 
    17 int main()
    18 {
    19     int t;
    20     point a,b,c,d;
    21     scanf("%d",&t);
    22     while(t--)
    23     {
    24         scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y,&c.x,&c.y,&d.x,&d.y);
    25         if(connected(a,b,c,d)) printf("Yes
    ");
    26         else printf("No
    ");
    27     }
    28     return 0;
    29 }
  • 相关阅读:
    [HAOI2015] 按位或
    [CF662C] Binary Table
    逻辑、集合运算上的卷积一览(FMT、FWT,……)
    从零开始的伯努利数
    [LGP2000] 拯救世界
    [BZOJ4180] 字符串计数
    [清华集训2017] 生成树计数
    [CF911G] Mass Change Queries
    微信公众号服务器配置(校验)
    mariadb数据库通过.ibd恢复过程(知道数据库结构的情况下)
  • 原文地址:https://www.cnblogs.com/nowandforever/p/4484736.html
Copyright © 2020-2023  润新知