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;
}
参考原理:
地址