直线的正交/平行判定
/*两个向量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)));
}