nyoj-1016-德莱联盟(向量叉乘判断线段相交)

叉乘的坐标表示:

A(X1,Y1), B(X2, Y2), C(XC,YC), D(XD, YD);
AB = (X2-X1, Y2-Y1);
CD = (XD-XC, YD-YC);

向量AB,CD的叉乘为:
AB*CD= (X2-X1)*(YD-YC)-(Y2-Y1)*(X2-X1);
例如两条直线,ab,cd来判断是否相交则根据
ans = (cd叉乘ca)*(cd叉乘bd)
如果ans大于等于0则相交,否则不相交。

下面是判断代码:

 1 /*
 2 Name:nyoj-1016-德莱联盟
 3 Copyright:
 4 Author:
 5 Date: 2018/4/26 10:24:45
 6 Description:
 7 */
 8 #include <stdio.h>
 9 #include <iostream>
10 using namespace std;
11 struct point{
12     double x,y;
13 };
14 int cross(point a,point b1,point b2){//求(b1-a) 和(b2-a) 的叉乘 
15     double x1,y1,x2,y2;
16     x1=b1.x-a.x;
17     y1=b1.y-a.y;
18     x2=b2.x-a.x;
19     y2=b2.y-a.y;   
20     return x1*y2-x2*y1;
21 }
22 int main()
23 {
24     int t;
25     cin>>t;
26     while(t--)
27     {
28         double ans1, ans2, ans3, ans4;
29         point A,B,C,D;
30         cin>>A.x>>A.y>>B.x>>B.y;//AB点的坐标 
31         cin>>C.x>>C.y>>D.x>>D.y;//CD点的坐标 
32         ans1=cross(A,C,D);  //注意cross中向量的顺序,要相减的向量放在前面;向量CA和向量DA的叉乘 
33         ans2=cross(B,C,D);
34         ans3=cross(C,A,B);
35         ans4=cross(D,A,B);
36         if(ans1*ans2<0 && ans3*ans4<0){//判断点是否在同侧,如果AB在CD的同侧,不能相交 
37             printf("Interseetion
");      
38         } else {
39             printf("Not Interseetion
");  
40         }
41     
42     }
43 }
原文地址:https://www.cnblogs.com/slothrbk/p/8952760.html