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

【题目链接】:click here~~

【题目大意】:求某点到一条线段的最小距离与最大距离。

【思路】:

分析可知,最大距离一定在端点处取得。那么接下来求最小距离时,先求出垂线与线段所在直线的交点,然后判断交点在不在线段上。如果在,则最小距离为垂线段的距离,即交点到此点的距离。如果不在,则最小距离必在另一端点取得。问题转换如何判断点与线段的垂足是否在线段上,可以利用叉积方便的求出。

代码:

/*
* Problem: NO:URAL 1348
* Running time: 1MS
* Complier: G++
* Author: herongwei
* Create Time: 20:00 2015/10/4 星期日
*/
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
typedef long long LL;
using namespace std;

#define min(a,b) a<b?a:b
#define max(a,b) a>b?a:b

const double eps=1e-8;
const double pi=acos(-1.0);

int sgn(double x)
{
    if(fabs(x) < eps)return 0;
    if(x < 0)return -1;
    else return 1;
}

struct POINT //点
{
    double x,y;
    POINT(){}
    POINT(double _x ,double _y)
    {
        x = _x;
        y = _y;
    }
    POINT operator -(const POINT &b)const
    {
        return POINT(x - b.x, y - b.y);
    }
    double operator ^(const POINT &b)const
    {
        return x*b.y - y*b.x;
    }
};

struct Seg //线段
{
    POINT s,e;
    Seg(){}
    Seg(POINT _s,POINT _e)
    {
        s=_s;
        e=_e;
    }
};

struct Line//直线
{
    POINT s,e;
    Line(){}
    Line(POINT _s,POINT _e)
    {
        s=_s;
        e=_e;
    }
};

//叉乘
double cross(POINT o, POINT a, POINT b)
{
    return (a.x - o.x) * (b.y - o.y) - (b.x - o.x) * (a.y - o.y);
}

//求两点间的距离
double dis(POINT a, POINT b)
{
    return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}

// 点到直线的距离,叉积求面积/底面长度得垂线长度
double Point_to_Line(POINT p,Line l)
{
    return fabs(cross(p,l.s,l.e)) / dis(l.s,l.e);
}

// 点到线段的距离
double Point_to_Seg(POINT p,Seg s)
{
    POINT tmp=p;
    tmp.x += s.s.y-s.e.y;
    tmp.y += s.e.x-s.s.x;
    if(cross(s.s, p, tmp) * cross(s.e, p, tmp) >= 0) /// 叉积判断垂足是否在线段上
    {
        return min(dis(p, s.s), dis(p, s.e));
    }
    return Point_to_Line(p, Line(s.s, s.e));///垂足在线段上
}

Seg s;
POINT p;
double L;

void solve()
{
    double ans1=Point_to_Seg(p,s),ans2=max(dis(p,s.s),dis(p,s.e));
    ans1=ans1>L?ans1-L:0,ans2=ans2>L?ans2-L:0;
    printf("%.2f\n%.2f\n",ans1,ans2);
}

int main()
{
   while(cin>>s.s.x>>s.s.y>>s.e.x>>s.e.y)
   {
       cin>>p.x>>p.y>>L;solve();
   }
   return 0;
}

/*
input	output
8 -6 8 6
0 0 7
1.00
3.00
*/

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-06 07:16:47

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

[数学]点到线段的距离

参考:http://blog.csdn.net/angelazy/article/details/38489293 海伦公式:http://zhidao.baidu.com/question/470074593 点到线段最短距离的运算与点到直线的最短距离的运算二者之间存在一定的差别,即求点到线段最短距离时需要考虑参考点在沿线段方向的投影点是否在线段上,若在线段上才可采用点到直线距离公式,如图1所示. 图1 (a)最短距离为点P与其在线段AB上投影C之间的线段PC (b)最短距离为点P与端点B(或

点到线段的距离模板

1 public static double PointToSegDist(double x, double y, double x1, double y1, double x2, double y2) 2 { 3 double cross = (x2 - x1) * (x - x1) + (y2 - y1) * (y - y1); 4 if (cross <= 0) return Math.Sqrt((x - x1) * (x - x1) + (y - y1) * (y - y1)); 5 6

点到线段的距离

double PointToSegDist(double x, double y, double x1, double y1, double x2, double y2) { double cross = (x2 - x1) * (x - x1) + (y2 - y1) * (y - y1); if (cross <= 0) return sqrt((x - x1) * (x - x1) + (y - y1) * (y - y1)); double d2 = (x2 - x1) * (x2 -

POJ 1584 A Round Peg in a Ground Hole 判断凸多边形 点到线段距离 点在多边形内

首先判断是不是凸多边形 然后判断圆是否在凸多边形内 kuangbin的板子,但是有些地方不明白. 判断多边形不是凸多边形后,为什么用判断点是否在凸多边形内的模板交WA了,而用判断点是否在任意多边形内的模板A了 而且判断点是否在任意多边形的注释,返回值为什么又说是凸多边形~~~ POJ 1584 A Round Peg in a Ground Hole(判断凸多边形,点到线段距离,点在多边形内) #include <iostream> #include <cstdio> #inclu

POJ - 1584 A Round Peg in a Ground Hole(判断凸多边形,点到线段距离,点在多边形内)

http://poj.org/problem?id=1584 题意 按照顺时针或逆时针方向输入一个n边形的顶点坐标集,先判断这个n边形是否为凸包. 再给定一个圆形(圆心坐标和半径),判断这个圆是否完全在n边形内部. 分析 1.判断给出了多边形是不是凸多边形. 2.判断圆包含在凸多边形中:一定要保证圆心在凸多边形里面.然后判断圆心到每条线段的距离要大于等于半径.. #include <iostream> #include <stdio.h> #include <string.h

5-7 点到原点的距离(多态)

给出下面的一个基类框架: class Point { protected: int dimension;//点的维数,最多不超过100维 private: int point_length[100]://点数组 public: Point ();//构造函数根据需要重载 float distance( );//计算当前点到原点的距离 void display();//输出点 } 以Point为基类建一个派生类Point_2D,增加以下数据成员: float x;//2D平面上点的x坐标 floa

POJ1584 判断多边形是否为凸多边形,并判断点到直线的距离

求点到直线的距离: double dis(point p1,point p2){   if(fabs(p1.x-p2.x)<exp)//相等的  {    return fabs(p2.x-pegx);    }  else     {   double k=(p2.y-p1.y)/(p2.x-p1.x);   double b=p2.y-k*p2.x;   return fabs(k*pegx-pegy+b)/sqrt(k*k+1);//返回的是距离的   }}判断多边形是否为凸多边形 if

csuoj 1503: 点到圆弧的距离

http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1503 1503: 点到圆弧的距离 时间限制: 1 Sec  内存限制: 128 MB  Special Judge 提交: 247  解决: 59 [提交][状态][讨论版] 题目描述 输入一个点P和一条圆弧(圆周的一部分),你的任务是计算P到圆弧的最短距离.换句话说,你需要在圆弧上找一个点,到P点的距离最小. 提示:请尽量使用精确算法.相比之下,近似算法更难通过本题的数据. 输入 输入包含最多

poj1584 A Round Peg in a Ground Hole 判断多边形凹凸,点到线的距离【基础计算几何】

大致思路:首先对于所给的洞的点,判断是否是凸多边形,图形的输入和输出可以是顺时针或者逆时针,而且允许多点共线 Debug 了好几个小时,发现如下问题 判断三点是否共线,可用斜率公式判断 POINT point_A, point_B, point_C; if(point_A.x == point_B.x || point_B.x == point_C.x){ if(point_A.x == point_B.x && point_B.x == point_C.x) continue; }els