解题思路:
已知直线p1p2,q1q2,只要判断出p1,p2分布在直线q1q2两侧并且q1,q2在直线q1q2两侧,就能证明直线p1p2和q1q2相交。
如何证明p1,p2分布在直线q1q2两侧呢?
使用向量叉积运算:已知向量q1q2,q1p1,q1p2。q1q2与q1p1叉积的符号与q1q2与q1p2叉积的符号的符号相反即可。在计算叉积的时候就想是在计算行列式,线代忘的差不多了。具体的公式,原理请参考http://dev.gameres.com/Program/Abstract/Geometry.htm#。
解答的时候用了int型,看了好久才发现应该要用double型的。
源码附上:
#include <iostream>
using namespace std;
struct node
{
double x,y;
}p1,p2,q1,q2;
void judge(node p1,node p2,node q1,node q2)
{
double a,b,c,d;
a=(q1.x-q2.x)*(q1.y-p2.y)-(q1.y-q2.y)*(q1.x-p2.x);
b=(q1.x-q2.x)*(q1.y-p1.y)-(q1.y-q2.y)*(q1.x-p1.x);
c=(p1.x-p2.x)*(p1.y-q1.y)-(p1.y-p2.y)*(p1.x-q1.x);
d=(p1.x-p2.x)*(p1.y-q2.y)-(p1.y-p2.y)*(p1.x-q2.x);
if((a*b<=0)&&(c*d<=0))
{
cout<<"Yes"<<endl;
}
else
{
cout<<"No"<<endl;
}
}
int main()
{
int T;
cin>>T;
while(T--)
{
cin>>p1.x>>p1.y>>p2.x>>p2.y>>q1.x>>q1.y>>q2.x>>q2.y;
judge();
}
return 0;
}