線分が交差しているかどうかを判断し、交点を求める方法.

15080 ワード

証明するなら私が貼った大物のブログを見ればいいです.私のコードは具体的に何をしているのか、それらのブログは証明しただけで、彼らのコードには注釈がありません.
  • 線分が交差するか否かを判断する:
  • 大物の張り紙を貼るhttps://segmentfault.com/a/1190000004070478
    struct Point{
        double x, y;
    }p1, p2, q1, q2; // 
    
     max min doubledouble max(double a, double b){
        return a>b?a:b;
    }
    double min(double a, double b){
        return a<b?a:b;
    }double chengji(double x1, double y1, double x2, double y2){
        return x1*y2 - y1*x2;
    }
    
    

    次に、2つの判断があります.まず、矩行が交差しているかどうかを判断し、線分が交差しているかどうかを判断します.
    bool jujiao(){  
        if(min(p1.x, p2.x) <= max(q1.x, q2.x)
         & min(q1.x, q2.x) <= max(p1.x, p2.x)
         & min(p1.y, p2.y) <= max(q1.y, q2.y)
         & min(q1.y, q2.y) <= max(p1.y, p2.y)
         )return 1;
        return 0;
    }bool xianjiao(){ 
        if(chengji(p2.x - p1.x, p2.y - p1.y, q1.x-p1.x, q1.y-p1.y) * chengji(p2.x - p1.x, p2.y - p1.y, q2.x-p1.x, q2.y-p1.y) <= 0 
        && chengji(q2.x - q1.x, q2.y - q1.y, p1.x-q1.x, p1.y-q1.y) * chengji(q2.x - q1.x, q2.y - q1.y, p2.x-q1.x, p2.y-q1.y) <= 0)
        return 1;
        return 0;
    }
    
  • 更にどのように交点を計算します:更に貼りますhttps://blog.csdn.net/Mr_HCW/article/details/82856056
  • double length(Point a, Point b){
        double sum1 = abs(b.x-a.x);
        double sum2 = abs(b.y-a.y);
        return sqrt(sum1*sum1 + sum2*sum2);
    }double d1 = abs(chengji(q1.x-p1.x, q1.y-p1.y, p2.x-p1.x, p2.y-p1.y))/length(p2.x-p1.x, p2.y-p1.y);
    double d2 = abs(chengji(q2.x-p1.x, q2.y-p1.y, p2.x-p1.x, p2.y-p1.y))/length(p2.x-p1.x, p2.y-p1.y);
    
     p1 p1p2 :
    dobule k = d1/(d1+d2);
    
    p1 :
    cx = k * (p2.x-p1.x);
    cy = k * (p2.y-p1.y);
    
    p1 :
    Point o = {p1.x + cx, p1.y + cy};