叉乘的坐标表示:
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 }