码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-05-07 16:23:36      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:

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\n");
26         else printf("No\n");
27     }
28     return 0;
29 }

 

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

标签:

原文地址:http://www.cnblogs.com/nowandforever/p/4484736.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!