简单计算几何,只要算出圆心到多边形上的最短距离和最长距离即可

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std; const int maxn=+;
struct Point
{
double x,y;
} p[maxn];
double a,b;
int n; double GetPointDistance(Point p1, Point p2)
{
return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
} double GetNearestDistance(Point PA, Point PB, Point P3)
{
double a,b,c;
a=GetPointDistance(PB,P3);
if(a<=0.00001) return 0.0f;
b=GetPointDistance(PA,P3);
if(b<=0.00001) return 0.0f;
c=GetPointDistance(PA,PB);
if(c<=0.00001) return a;
if(a*a>=b*b+c*c) return b;
if(b*b>=a*a+c*c) return a;
double l=(a+b+c)/;
double s=sqrt(l*(l-a)*(l-b)*(l-c));
return *s/c;
} int main()
{
double Max=-;
double Min=-;
scanf("%d%lf%lf",&n,&a,&b);
Point T;
T.x=a;
T.y=b;
for(int i=; i<n; i++) scanf("%lf%lf",&p[i].x,&p[i].y);
for(int i=; i<n; i++)
{
double MinLen=GetNearestDistance(p[(i+)%n],p[i],T);
if(Min==-) Min=MinLen;
else Min=min(Min,MinLen); double Len1=sqrt((p[i].x-a)*(p[i].x-a)+(p[i].y-b)*(p[i].y-b));
double Len2=sqrt((p[(i+)%n].x-a)*(p[(i+)%n].x-a)+(p[(i+)%n].y-b)*(p[(i+)%n].y-b));
double MaxLen=max(Len1,Len2);
if(Max==-) Max=MaxLen;
else Max=max(Max,MaxLen);
} printf("%lf\n",3.1415926*(Max*Max-Min*Min));
return ;
}

最新文章

  1. Useful links
  2. 【转】eclipse导入V7包出现错误解决办法
  3. osg中的视点控制
  4. struts2:struts.xml配置文件详解
  5. img下出现几像素空白的问题
  6. jquery设置div,文本框 表单的值示例
  7. Unity3D脚本中文系列教程(十二)
  8. swift版本hello
  9. 龙芯8089_D安装debian 8 iessie
  10. JavaScript-学习一全局变量
  11. Yii2.0中文开发向导——删除数据
  12. Go Code
  13. quartz 定时任务
  14. AdobeFlashBuilder还不如AdobeFlashProfessional写actionscript体验好
  15. bzoj2683简单题 cdq分治
  16. Android开发学习之路--数据持久化之初体验
  17. mysql数据库优化(转)
  18. 排列组合n选m算法
  19. struts2框架学习笔记4:获取参数
  20. Android 图表

热门文章

  1. [code]判断周期串
  2. 学习最短路建图 HUD 5521
  3. Object.setPrototypeOf 方法的使用
  4. linux ubuntu平台下安装Scrapy
  5. ios view改变背景图
  6. 几个SQL语句笔试题
  7. HDU - 1865 1string(大数)
  8. IDL 实现 EOF(经验正交函数分析)
  9. 转:Selenium借助AutoIt识别上传(下载)详解
  10. linux下安装rabbitmq