计算几何模板总结(二)

    xiaoxiao2021-03-25  105

    直线的正交/平行判定

    /*两个向量a,b正交,等价于,向量a,b的点积为0*/

    bool isOrthogonal(Vector a,Vector b){

    return equals(dot(a,b),0.0);

    }

    bool isOrthogonal(Point a1,Point a2,Point b1,Point b2){

    return isOrthogonal(a1-a2,b1-b2);

    }

    bool isOrthogonal(Segment s1,Segment s2){

    return equals(dot(s1.p2-s1.p1,s2.p2-s2.p1),0.0);

    }

    /*两个向量a,b平行,等价于,向量a,b的叉积为0*/

    bool isParallel(Vector a,Vector b){

    return equals(cross(a,b),0.0);

    }

    bool isParallel(Point a1,Point a2,Point b1,Point b2){

    return isParallel(a1-a2,b1-b2);

    }

    bool isParallel(Segment s1,Segment s2){

    return equals(cross(s1.p2-s1.p1,s2.p2-s2.p1),0.0);

    }

    /*根据三角形三边关系可以推出,点在线段上的投影位置*/

    Point project(Segment s,Point p){

    Vector base=s.p2-s,p1;

    double r=dot(p-s.p1,base)/norm(base);

    return s.p1+base*r;

    }

    /*\以线段s为对称轴与点p成线对称的点*/

    Point reflect(Segment s,Point p){

    return p+(project(s,p)-p)*2.0;

    }

    /*两点间的距离*/

    double getDistance(Point a,Point b){

    return abs(a-b);

    }

    /*直线l与点p的距离*/

    double getDistanceLP(Line l,Point p){

    return abs(cross(l.p2-l.p1)/abs(l.p2-l.p1));

    }

    /*线段s与点p的距离*/

    double getDistanceSP(Segment s,Point p){

    if(dot(s.p2-s.p1,p-s.p1)<0.0) return abs(p-s.p1);

    if(dot(s.p1-s.p2,p-s.p2)<0.0) return abs(p-s.p2);

    ` return getDistanceLP(s,p);

    }

    /*线段s1与线段s2的距离*/

    double getDistance(Segment s1,Segment s2){

    if(intersect(s1,s2)) return 0.0;

    return min(min(getDistance(s1,s2.p1),getDistance(s1,s2.p2)),min(getDistance(s2,s1.p1),getDistance(s2,s1.p2)));

    }

    转载请注明原文地址: https://ju.6miu.com/read-20860.html

    最新回复(0)