数学渣渣看了一下午各种找公式才明白:下面写一下理解:
判断两个线段相交与否。可以看成直线是否与线段相交
根据高数所学,向量的叉乘积,可以利用右手法则来判断结果的方向。
那么如果两种情况的方向一个上,一个下,那么自然也就是不在直线的同侧,那么就满足条件了。
代码是有需要注意x,y用double类型,否则乘法会有问题
#include <iostream>
#include <stdio.h>
using namespace std;
struct node
{
double x,y;
}a,b,c,d,ab,bc,bd;
void solve()
{
double p[4];
p[0]=(b.x-a.x)*(b.y-c.y)-(b.y-a.y)*(b.x-c.x); //ba X bc
p[1]=(b.x-a.x)*(b.y-d.y)-(b.y-a.y)*(b.x-d.x); //ba X bd
p[2]=(d.x-c.x)*(d.y-a.y)-(d.y-c.y)*(d.x-a.x);
p[3]=(d.x-c.x)*(d.y-b.y)-(d.y-c.y)*(d.x-b.x);
if ((p[0]*p[1]<=0)&&(p[2]*p[3]<=0))
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
int main()
{
int n;
cin>>n;
while(n--)
{
cin>>a.x>>a.y>>b.x>>b.y>>c.x>>c.y>>d.x>>d.y;
solve();
}
return 0;
}