double determinant(double v1, double v2, double v3, double v4) // 行列式
{
return (v1*v3-v2*v4);
}
bool intersect3(Point aa, Point bb, Point cc, Point dd)
{
double delta = determinant(bb.x-aa.x,dd.x-cc.x, dd.y-cc.y, bb.y-aa.y);
if ( delta<=(1e-6) && delta>=-(1e-6) ) // delta=0,表示两线段重合或平行
{
return false;
}
double namenda = determinant(dd.x-cc.x, aa.x-cc.x, aa.y-cc.y, dd.y-cc.y) / delta;
if ( namenda>1 || namenda<0 )
{
return false;
}
double miu = determinant(bb.x-aa.x, aa.x-cc.x, aa.y-cc.y, bb.y-aa.y) / delta;
if ( miu>1 || miu<0 )
{
return false;
}
return true;
}
两条线段求交
设有两线段AB和CD,其端点坐标分别为和
,它们所在直线的参数方程分别为:
若两线段相交,则交点的参数值,应满足:
即
因此,若行列式
表示两线段AB和CD重合或平行。一般做为它们不相交来处理。如果,则可求出交点对应的两个参数值:
需要注意,只有时两线段才真正相交。否则,交点在两线段或其中某一条线段的延长线上,这时仍然认为是两线段不相交。
原文:https://blog.csdn.net/qq_19707521/article/details/80609448