题目链接:Click here~~
第二道计算几何,虽然方法很笨,但还是想记录下。
题意:
求某点到一条线段的最小距离与最大距离。
解题思路:
稍加分析可知,最大距离一定在端点处取得。
求最小距离时,先求出垂线与线段所在直线的交点,然后判断交点在不在线段上。
如果在,则最小距离为垂线段的距离,即交点到此点的距离。
如果不在,则最小距离必在另一端点取得。
#include <math.h> #include <stdio.h> #include <stdlib.h> #include <algorithm> using namespace std; #define FileIn freopen("in.ads","r",stdin) #define FileOut freopen("out.ads","w",stdout) struct P { int x,y; }A,B,C; double dis(double Ax,double Ay,double Bx,double By) { return sqrt((Ax-Bx)*(Ax-Bx)+(Ay-By)*(Ay-By)); } int main() { int R; double k,b,Px,Py; double ans1,ans2; while(~scanf("%d%d%d%d",&A.x,&A.y,&B.x,&B.y)) { if(A.x > B.x) C = A , A = B , B = C; scanf("%d%d%d",&C.x,&C.y,&R); ans2 = max(dis(C.x,C.y,A.x,A.y),dis(C.x,C.y,B.x,B.y))-R; ans2 = ans2<0 ? 0 : ans2; if(A.x == B.x) { Px = A.x; Py = C.y; struct P tmp; if(A.y > B.y) tmp = A , A = B , B = tmp; if(Py >= A.y && Py <= B.y) ans1 = dis(C.x,C.y,Px,Py)-R; else ans1 = min(dis(C.x,C.y,A.x,A.y),dis(C.x,C.y,B.x,B.y))-R; } else { k = 1.0*(B.y-A.y)/(B.x-A.x); b = A.y - k*A.x; Px = (C.x + k*C.y - k*b) / (k*k + 1); Py = k*Px + b; if(Px >= A.x && Px <= B.x) ans1 = dis(C.x,C.y,Px,Py)-R; else ans1 = min(dis(C.x,C.y,A.x,A.y),dis(C.x,C.y,B.x,B.y))-R; } ans1 = ans1<0 ? 0 : ans1; printf("%.2f\n%.2f\n",ans1,ans2); } return 0; }