POJ3675

用三角剖分可以轻松搞定,数据也小 随便AC。

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
const double eps=1e-10,PI=acos(-1.0);int cmp(double k)
{return k<-eps ? -1:k>eps ? 1:0;
}const double pi=acos(-1.0);inline double sqr(double x)
{return x*x;
}struct point
{double x,y;point (){}point (double a,double b):x(a),y(b){}bool input(){return scanf("%lf%lf",&x,&y)!=EOF;}friend point operator +(const point &a,const point &b){return point(a.x+b.x,a.y+b.y);} friend point operator -(const point &a,const point &b){return point(a.x-b.x,a.y-b.y);}friend bool operator ==(const point &a,const point &b){return cmp(a.x-b.x)==0&&cmp(a.y-b.y)==0;}friend point operator *(const point &a,const double &b){return point(a.x*b,a.y*b);}friend point operator*(const double &a,const point &b){return point(a*b.x,a*b.y);}friend point operator /(const point &a,const double &b){return point(a.x/b,a.y/b);}double norm(){return sqr(x)+sqr(y);}
};double mysqrt(double x)
{return sqrt(x);
}
double dot(const point &a,const point &b)
{return a.x*b.x+a.y*b.y;
}
double cross(const point &a,const point &b)
{return a.x*b.y-a.y*b.x;
}
double abs(const point &o)
{return sqrt(dot(o,o));
}
void circle_cross_line(point a,point b,point o,double r,point ret[],int &num)
{double x0=o.x,y0=o.y;double x1=a.x,y1=a.y;double x2=b.x,y2=b.y;double dx=x2-x1,dy=y2-y1;double A=dx*dx+dy*dy;double B=2*dx*(x1-x0)+2*dy*(y1-y0);double C=sqr(x1-x0)+sqr(y1-y0)-sqr(r);double delta=B*B-4*A*C;num=0;if(cmp(delta)>=0){double t1=(-B-mysqrt(delta))/(2*A);double t2=(-B+mysqrt(delta))/(2*A);if(cmp(t1-1)<=0&&cmp(t1)>=0){ret[num++]=point(x1+t1*dx,y1+t1*dy);}if(cmp(t2-1)<=0&&cmp(t2)>=0){ret[num++]=point(x1+t2*dx,y1+t2*dy);}}
}point crosspt(const point &a,const point &b,const point &p,const point &q)
{double a1=cross(b-a,p-a);double a2=cross(b-a,q-a);return (p*a2-q*a1)/(a2-a1);
}double sector_area(const point &a,const point &b,const double r)
{double theta=atan2(a.y,a.x)-atan2(b.y,b.x);while(cmp(theta)<=0)theta+=2*PI;while(cmp(theta-2*PI)>0)theta-=2*PI;theta=min(theta,2*PI-theta);return r*r*theta/2.;
}double calc_c(const point &a,const point &b,const double r)
{point p[2];int num=0;bool ina=cmp(abs(a)-r)<0;bool inb=cmp(abs(b)-r)<0;if(ina){if(inb)return fabs(cross(a,b))/2.;else{circle_cross_line(a,b,point(0,0),r,p,num);return fabs(sector_area(b,p[0],r))+fabs(cross(a,p[0]))/2.;}}else{if(inb){circle_cross_line(a,b,point(0,0),r,p,num);return fabs(sector_area(p[0],a,r))+fabs(cross(p[0],b))/2.;   }else{circle_cross_line(a,b,point(0,0),r,p,num);if(num==2){return fabs(sector_area(a,p[0],r))+fabs(sector_area(p[1],b,r))+fabs(cross(p[0],p[1]))/2.;}else{return fabs(sector_area(a,b,r));}}}
}double area(int n,point res[],double r)
{double ret=0.;for(int i=0;i<n;i++){int sgn=cmp(cross(res[i],res[(i+1)%n]));if(sgn!=0){ret+=sgn*calc_c(res[i],res[(i+1)%n],r);}    }return ret;
}
point pp[100];
int main()
{freopen("t.txt","r",stdin);double r;int n;while(scanf("%lf",&r)!=EOF){scanf("%d",&n);for(int i=0;i<n;i++)pp[i].input();pp[n]=pp[0];printf("%.2f\n",fabs(area(n,pp,r))+eps);
}return 0;
}

  

转载于:https://www.cnblogs.com/heisenberg-/p/6724576.html

POJ3675 Telescope 圆和多边形的交相关推荐

  1. 牛客网暑期ACM多校训练营(第三场) J Distance to Work 计算几何求圆与多边形相交面积模板...

    链接:https://www.nowcoder.com/acm/contest/141/J 来源:牛客网 Eddy has graduated from college. Currently, he ...

  2. openlayers6 踩坑系列(三)绘制和编辑(矩形,圆,多边形,点,线)

    重要:博客内使用地图全替换为WMap,想使用的请参考我这篇博客(WMap) 最近在做矢量图形这一块,发现圆形和多边形,都可以使用openlayers自带的Modify类进行编辑,然后随意放大缩小旋转, ...

  3. leaflet动态绘制圆、多边形

    使用leaflet在页面中动态的绘制一个圆形,主要需要解决的有两点,其一是如何确定圆的中心,其二是如何确定圆的半径.解决了这两点,剩下的就是把圆作为图层添加进map中了. 使用leaflet绘制多边形 ...

  4. 计算几何 多边形的交与并

    /** 多边形的交,多边形的边一定是要按逆时针方向给出* 还要判断是凸包还是凹包,调用相应的函数* 面积并,只要和面积减去交即可*/ #include <bits/stdc++.h> us ...

  5. POJ 1584 A Round Peg in a Ground Hole(点到直线距离,圆与多边形相交,多边形是否为凸)...

    题意:给出一个多边形和一个圆,问是否是凸多边形,若是则再问圆是否在凸多边形内部. 分3步: 1.判断是否是凸多边形 2.判断点是否在多边形内部 3.判断点到各边的距离是否大于等于半径 上代码: #in ...

  6. Gym-100935I Farm 计算几何 圆和矩形面积交

    题面 题意:就是给你一个圆,和你一个矩形,求面积并,且 保证是一种情况:三角剖分后 一个点在圆内 两个在圆外 题解:可以直接上圆与凸多边形交的板子,也可以由这题实际情况,面积等于扇形减两个三角形 1 ...

  7. 简单几何(圆与多边形公共面积) UVALive 7072 Signal Interference (14广州D)

    题目传送门 题意:一个多边形,A点和B点,满足PB <= k * PA的P的范围与多边形的公共面积. 分析:这是个阿波罗尼斯圆.既然是圆,那么设圆的一般方程:(x + D/2) ^ 2 + (y ...

  8. 使用CAD圆和多边形内、外接圆命令绘制图形。使用CAD多线段命令绘制图形

    如下图所示根据标注的尺寸,用CAD画图软件绘制出一样的图形: 目标对象 操作工具 操作系统:Windows10 CAD软件:CAD梦想画图(轻量级CAD.国产CAD软件) 步骤 1.先使用CAD圆命令 ...

  9. Leaflet学习之路五——动态绘制图形(点、线、圆、多边形)

    leaflet动态绘制图形 动态绘点 动态绘线 动态绘多边形 动态绘制矩形 2020.3.16更新 更新日志: 2019.1.14:更新了绘制多边形时tmpline没有移除的问题 2019.1.15: ...

最新文章

  1. 633. Sum of Square Numbers
  2. linux 在线帮助,linux教程之在线帮助
  3. 数据可视化,带给你的惊艳并不止这一点!
  4. Linux学习之ARM开发板连接ubuntu18.04LTS及NFS相关配置
  5. cad在布局怎么调比例_大神们都在用的9个CAD制图技巧,你会用几个?
  6. php进阶课程,php进阶教程学习
  7. css改变滚动条样式
  8. 网络诈骗是大数据的“原罪”吗
  9. mysql索引讲解最好
  10. Bind variables in 'in' condition(在in中动态的绑定参数(参数个数可变))
  11. centos 安装 LAMP
  12. bootstrap模态框弹窗导致页面左移
  13. 谈ISO9000-3内容及其与CMM关系
  14. 怎么把excel表格转换成word格式
  15. 如何隐藏CAD图层?怎么显示隐藏的CAD图层?
  16. 输出教师信息c语言作业,C语言教师管理系统代码(最新整理)
  17. 派克比例方向控制阀放大器
  18. cocos Uncaught Download text failed 错误解决
  19. Mahalanobis距离(马氏距离)
  20. 撤回的消息服务器还可以看到,微信消息被撤回,居然还能看到!原来还有11个你不知道...

热门文章

  1. CIFAR-10 dataset 的下载与使用
  2. oracle中 trunc(),round(),ceil(),floor的使用
  3. jquery 与其他库冲突解决方案
  4. Eclipse to android
  5. jtabel 遍历_使用抽象表模型获取JTable中选定的行
  6. Matlab各种分布的函数
  7. MATLAB集合运算
  8. 前端jenkins打包编译发布项目流程
  9. AUTOSAR从入门到精通100讲(十一)-AUTOSAR NVM基础知识
  10. oracle exp 00006,Oracle 12.1新特性----使用RMAN从备份中实现recover table