题目链接: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;
}