点到线段的最短距离

#include<bits/stdc++.h>
using namespace std;
const int M = 1e5+10 ;
const double pi = acos(-1.0) ;
int n ;
double sx , sy ;//源点
double X[M] , Y[M] ;
double minn = 1e18 , maxn = -1 ;

double dist (int id) { return sqrt((X[id]-sx)*(X[id]-sx)+(Y[id]-sy)*(Y[id]-sy));} 

double segdist (int id1 , int id2) {//源点到多边形上两点id1,id2的最短距离
    double a = Y[id2] - Y[id1] ;
    double b = X[id1] - X[id2] ;
    double c = X[id2]*Y[id1]-Y[id2]*X[id1] ;

    if ((X[id1]-X[id2])*(sx-X[id2])+(Y[id1]-Y[id2])*(sy-Y[id2]) < 0) return 1e18 ;//如果垂足落在线段外,返回无穷
    if ((X[id2]-X[id1])*(sx-X[id1])+(Y[id2]-Y[id1])*(sy-Y[id1]) < 0) return 1e18;//利用点积钝角<0

    return fabs(c+sy*b+sx*a) / sqrt(a*a+b*b) ; //利用叉积和面积法
}

int main () {
    cin >> n >> sx >> sy ;
    for (int i = 0 ; i < n ; i ++) {
        scanf ("%lf%lf" , &X[i],&Y[i]) ;
    }
    for (int i = 0 ; i < n ; i ++) {
        maxn = max (maxn , dist(i)) ;
        minn = min (minn , dist(i)) ;//垂足落在线段外时,源点到线段的最短距离

        minn = min (minn , segdist(i,(i+1)%n)) ;
    }
    cout.precision(12) ;
    cout << pi*(maxn*maxn-minn*minn) << endl ;
    return 0 ;
}

  

时间: 2024-08-10 23:30:26

点到线段的最短距离的相关文章

POJ 1584 A Round Peg in a Ground Hole(凸多边形判断 + 点是否在多边形内 + 点到线段的最短距离)

题目:传送门 题意:给你一个圆和一个多边形, 判断多边形是不是凸多边形,如果是,接着判断圆是否在凸多边形内部. #include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <queue> #include <map> #include <vector> #include <set> #inclu

[数学]点到线段的距离

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

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

[题目链接]:click here~~ [题目大意]:求某点到一条线段的最小距离与最大距离. [思路]: 分析可知,最大距离一定在端点处取得.那么接下来求最小距离时,先求出垂线与线段所在直线的交点,然后判断交点在不在线段上.如果在,则最小距离为垂线段的距离,即交点到此点的距离.如果不在,则最小距离必在另一端点取得.问题转换如何判断点与线段的垂足是否在线段上,可以利用叉积方便的求出. 代码: /* * Problem: NO:URAL 1348 * Running time: 1MS * Comp

NEU 1496 Planar map 计算几何,点到线段距离 难度:0

问题 H: Planar map 时间限制: 1 Sec  内存限制: 128 MB提交: 24  解决: 22[提交][状态][讨论版] 题目描述 Tigher has work for a long time in a famous company.One day she is given a planar map(look at the following) and a point.The planar map can be regarded as a polygon.The planar

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

点到多边形的最短距离 团队的成果

Cacti是一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形分析工具.Cacti是通过 snmpget来获取数据,使用 RRDtool绘画图形,而且你完全可以不需要了解RRDtool复杂的参数.它提供了非常强大的数据和用户管理功能,可以指定每一个用户能查看树状结构.host以及任何一张图,还可以与LDAP结合进行用户验证,同时也能自己增加模板,功能非常强大完善.界面友好.软件 Cacti 的发展是基于让 RRDTool 使用者更方便使用该软件,除了基本的 Snmp 流量

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

计算点到线段的最近点

如果该线段平行于X轴(Y轴),则过点point作该线段所在直线的垂线,垂足很容易求得,然后计算出垂足,如果垂足在线段上则返回垂足,否则返回离垂足近的端点:如果该线段不平行于X轴也不平行于Y轴,则斜率存在且不为0.设线段的两端点为pt1和pt2,斜率为:k = ( pt2.y - pt1. y ) / (pt2.x - pt1.x );该直线方程为:y = k*( x - pt1.x) + pt1.y.其垂线的斜率为 - 1 / k,垂线方程为:y = (-1/k) * (x - point.x)

[Processing]点到线段的最小距离

1 PVector p1,p2,n; 2 float d = 0; 3 4 void setup() 5 { 6 size(600,600); 7 8 p1 = new PVector(150,30);//线段第一个端点 9 p2 = new PVector(-25,-100);//线段第二个端点 10 11 PVector vec = PVector.sub(p1,p2); 12 vec.normalize(); 13 n = new PVector(-vec.y,vec.x);//与线段垂直