当前位置: 代码迷 >> 综合 >> 计算几何模板总结(二)
  详细解决方案

计算几何模板总结(二)

热度:97   发布时间:2024-01-21 01:49:03.0

直线的正交/平行判定

/*两个向量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)));

}

  相关解决方案