2 D平面上の2つの線分が交差しているかどうかを判断する

929 ワード

タイトル:タイトルのように、セグメントの端点が含まれています.重ね合わせも交わる.
問題解決の考え方:
2つの線分はそれぞれAB,CDであると仮定する.AB直線の方程式はFab(x,y)=(y−ya)(xa−xb)−(x−xa)(ya−yb)=0である.線分ABが線分CDと交差すると、必ず
(1)線分ABと線分CDとが交わる
(2)線分CDと線分ABとが交わる
線分CDが直線ABと交わるか否かを判断するには、点Cと点Dが直線ABの異なる側、すなわちFab(xc,yc)*Fab(xd,yd)<=0であると判断するだけである.0に等しいのは、点Cまたは点DがAB直線上にあることを示す.そして、線分ABと線分CDとが交わると、必ず
(1)Fab(xc, yc)*Fab(xd, yd) <= 0
(2)Fcd(xa, ya)*Fcd(xb, yb) <= 0
コードは次のとおりです.
struct Point{
    double x;
    double y;
    Point(double _x, double _y) : x(_x), y(_y){};
};
 
//a   bc    
double mult(Point a, Point b, Point c){
    return (a.x - c.x)*(b.y - c.y) - (a.y - c.y)*(b.x - c.x);
}
 
bool solution(Point aa, Point bb, Point cc, Point dd){
    if (mult(aa, cc, dd)*mult(bb, cc, dd) > 0)
    {
        return false;
    }
    if (mult(cc, aa, bb)*mult(dd, aa, bb) > 0)
    {
        return false;
    }
    return true;
}