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 }
时间: 2024-10-12 21:47:56