点到线段的最短距离
2016-01-15 21:17
323 查看
#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 ; }
相关文章推荐
- 如何利用Java获取系统的信息(CPU、内存、各盘符使用情况)
- Ising模型(伊辛模型)
- Cocos2d-JS cc.DrawNode用法
- Cow Exhibition(DP)
- Java数据结构之迭代器
- Hadoop集群中引入新DataNode节点
- MQTT协议详解
- 开发RESTful WebService
- 大数乘法
- Linux基本命令――统计和检索文件内容
- C/C++——构造函数、复制构造函数和析构函数的执行时刻
- 按钮的点击效果设置
- Java API 与HBase交互实例
- 转:DSP学习经验
- js数组的sort排序详解
- Codeforces Round #339(Div.2)
- 第一周:简单的计算程序
- C/C++ 经典面试题汇总
- HBase API的简单的介绍
- AngularJS 数据建模