题意:求两线段是否相交
使用叉乘与向量的方法
数论资料 :http://dev.gameres.com/Program/Abstract/Geometry.htm#
( P1 - Q1 ) × ( Q2 - Q1 ) * ( Q2 - Q1 ) × ( P2 - Q1 ) >= 0 ( Q1 - P1 ) × ( P2 - P1 ) * ( P2 - P1 ) × ( Q2 - P1 ) >= 0
其中P1P2是一条线段的两端点,Q1Q2是另一个线段的两段点。
( P1 - Q1 ) × ( Q2 - Q1 )代表X1*Y2 + X3*Y1 + X2*Y3 - X3*Y2 - X1*Y3 - X2*Y1,
AC代码:
#include<bits/stdc++.h>
using namespace std;
int t;
struct node
{
double x;
double y;
}ma[9];
double xx(node a,node b,node c)
{
return a.x*b.y+b.x*c.y+a.y*c.x-a.x*c.y-c.x*b.y-b.x*a.y;
}
int main()
{
cin>>t;
while(t--)
{
for(int i=1;i<=4;i++)
{
cin>>ma[i].x>>ma[i].y;
}
double x1=xx(ma[1],ma[3],ma[4]);
double x2=xx(ma[4],ma[3],ma[2]);
double x3=xx(ma[3],ma[1],ma[2]);
double x4=xx(ma[2],ma[1],ma[4]);
if(x1*x2>=0&&x3*x4>=0)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}