URAL 1348 Goat in the Garden 2(点到线段的距离)

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值