hdu3060Area2(任意多边形相交面积)
多边形的面积求解是通过选取一个点(通常为原点或者多边形的第一个点)和其它边组成的三角形的有向面积。
对于两个多边形的相交面积就可以通过把多边形分解为三角形,求出三角形的有向面积递加。三角形为凸多边形,因此可以直接用凸多边形相交求面积的模板。
凸多边形相交后的部分肯定还是凸多边形,所以只需要判断哪些点是相交部分上的点,最后求下面积。
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<vector>
#include<cmath>
#include<queue>
#include<set>
using namespace std;
#define N 510
#define LL long long
#define INF 0xfffffff
const double eps = 1e-;
const double pi = acos(-1.0);
const double inf = ~0u>>;
struct point
{
double x,y;
point(double x=,double y=):x(x),y(y) {} //构造函数 方便代码编写
}p[N],q[N];
typedef point pointt;
pointt operator + (point a,point b)
{
return point(a.x+b.x,a.y+b.y);
}
pointt operator - (point a,point b)
{
return point(a.x-b.x,a.y-b.y);
}
int dcmp(double x)
{
if(fabs(x)<eps) return ;
else return x<?-:;
}
bool operator == (const point &a,const point &b)
{
return dcmp(a.x-b.x)==&&dcmp(a.y-b.y)==;
}
double cross(point a,point b)
{
return a.x*b.y-a.y*b.x;
}
double Polyarea(point p[],int n)
{
if(n<) return ;
double area = ;
for(int i = ; i < n ; i++)
area+=cross(p[i],p[i+]);
return fabs(area)/;
}
//double Polyarea(point p[], int n)
//{
// if(n < 3) return 0.0;
// double s = p[0].y * (p[n - 1].x - p[1].x);
// p[n] = p[0];
// for(int i = 1; i < n; ++ i)
// s += p[i].y * (p[i - 1].x - p[i + 1].x);
// return fabs(s * 0.5);
//}
bool intersection1(point p1, point p2, point p3, point p4, point& p) // 直线相交
{
double a1, b1, c1, a2, b2, c2, d;
a1 = p1.y - p2.y;
b1 = p2.x - p1.x;
c1 = p1.x*p2.y - p2.x*p1.y;
a2 = p3.y - p4.y;
b2 = p4.x - p3.x;
c2 = p3.x*p4.y - p4.x*p3.y;
d = a1*b2 - a2*b1;
if (!dcmp(d)) return false;
p.x = (-c1*b2 + c2*b1) / d;
p.y = (-a1*c2 + a2*c1) / d;
return true;
} double convexpolygon(point p[],point q[],int n,int m)
{
int i,j;
point ch[],cnt[];
p[n] = p[],q[m] = q[];
memcpy(ch,q,sizeof(point)*(m+));
int f2,g = ;
for(i = ;i < n; i++)
{
int f1 = dcmp(cross(p[i+]-p[i],ch[]-p[i]));
g = ;
for(j = ;j < m; j++,f1 = f2)
{
if(f1>=) cnt[g++] = ch[j];
f2 = dcmp(cross(p[i+]-p[i],ch[j+]-p[i]));
if((f1^f2)==-)
{
point pp;
intersection1(p[i],p[i+],ch[j],ch[j+],pp);
cnt[g++] = pp;
}
}
cnt[g] = cnt[];
memcpy(ch,cnt,sizeof(point)*(g+));
m = g;
}
return Polyarea(ch,g);
}
double solve(point p[],point q[],int n,int m)
{
int i,j;
double area = ;
point tp[],tq[];
tp[] = p[];tq[] = q[];
for(i = ;i < n-; i++)
{
int k1 = dcmp(cross(p[i]-p[],p[i+]-p[]));
tp[] = p[i],tp[] = p[i+];
if(k1 < ) swap(tp[],tp[]); for(j = ;j < m- ;j++)
{
tq[] = q[j],tq[] = q[j+];
int k2 = dcmp(cross(q[j]-q[],q[j+]-q[]));
if(k2<) swap(tq[],tq[]); area+=convexpolygon(tp,tq,,)*k1*k2;
}
}
return Polyarea(p,n)+Polyarea(q,m)-area;
}
int main()
{
int n,m,i;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i = ; i < n ;i++)
{
scanf("%lf%lf",&p[i].x,&p[i].y);
}
for(i = ; i < m; i++)
{
scanf("%lf%lf",&q[i].x,&q[i].y);
}
p[n] = p[],q[m] = q[];
double ans = solve(p,q,n,m);
printf("%.2f\n",ans);
}
return ;
}
hdu3060Area2(任意多边形相交面积)的更多相关文章
- 牛客网暑期ACM多校训练营(第三场) J Distance to Work 计算几何求圆与多边形相交面积模板
链接:https://www.nowcoder.com/acm/contest/141/J来源:牛客网 Eddy has graduated from college. Currently, he i ...
- hdu 5130(2014广州 圆与多边形相交模板)
题意:一个很多个点p构成的多边形,pb <= pa * k时p所占区域与多边形相交面积 设p(x,y), (x - xb)^2+(y - yb)^2 / (x - xa)^2+(y ...
- HDU 2036 求任意多边形面积向量叉乘
三角形的面积可以使用向量的叉积来求: 对于 三角形的面积 等于: [(x2 - x1)*(y3 - y1)- ( y2 - y1 ) * ( x3 - x1 ) ] / 2.0 但是面积是有方向的, ...
- poj1654 -- Area (任意多边形面积)
Area Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 20444 Accepted: 5567 Description ...
- Gym 100952J&&2015 HIAST Collegiate Programming Contest J. Polygons Intersection【计算几何求解两个凸多边形的相交面积板子题】
J. Polygons Intersection time limit per test:2 seconds memory limit per test:64 megabytes input:stan ...
- 一种实用性较强的求IOU的算法(任意多边形之间的IOU)
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...
- 任意多边形切割/裁剪(附C#代码实现)
本实现主要参考了发表于2003年<软件学报>的<一个有效的多边形裁剪算法>(刘勇奎,高云,黄有群)这篇论文,所使用的理论与算法大都基于本文,对论文中部分阐述进行了详细解释,并提 ...
- C# 实现 任意多边形切割折线算法
1. 内容简介 本文旨在解决任意多边形切割折线,获取切割之后的折线集合. 本文实现的算法内容包括:判断两条线段是否相交,如若相交,获取交点集合.对线上的点集,按斜率方向排序.判断点是否在多边形内 ...
- P1183 多边形的面积
一道睡论数论题 其实是AC300祭才做的水题 题意: 很直白的的题意啊,就是求任意一个多边形的面积 所以我们来安利一下一个求多边形面积的数学通式: 给定多边形的顶点坐标(有序),让你来求这个多边形的面 ...
随机推荐
- python: linux下安装redis
Python连接时报拒绝连接,需要重装redis: 1) 卸载redis sudo apt-get remove redis-server sudo apt-get autoremove 2)编译安装 ...
- weblogic远程调试
修改 bin/startWebLogic.cmd 增加红字部分,其中9999是调试监听端口,然后可以连接这个端口进行远程调试 set JAVA_DEBUG=-Xdebug -Xnoagent -Xru ...
- 20150629_Andriod_06_插入_删除_弹出式操作数据
Fr_06_view_s6 --> activity_f6_insert --> activity_f7__delete ******************** ...
- Java中数组的特性
转载:http://blog.csdn.net/zhangjg_blog/article/details/16116613 数组是基本上所有语言都会有的一种数据类型,它表示一组相同类型的数据的集合,具 ...
- 创建Linux swap
创建SWAP文件(下面指定的是8G容量,系统物理内存8G): dd if=/dev/zero of=/data/swapfile bs=1M count=8192 格式化该文件 mkswap swap ...
- css3 转换transfrom 过渡transition 和两个@
做了一个demo.用到一些css3的动画,还是不太熟练,总结了一下. 1. -webkit-font-smoothing: antialiased; -webkit-font-smoot ...
- jquery.util.easyui.dialog
(function ($) { var $parent = parent.$; //获取弹出窗口数据集合 function getDialogs() { var dialogs = $parent(& ...
- 2016年12月6日 星期二 --出埃及记 Exodus 21:1
2016年12月6日 星期二 --出埃及记 Exodus 21:1 "These are the laws you are to set before them:你在百姓面前所要立的典章是这 ...
- FlashFXP命令行
flashfxp.exe -upload ftp://user:pass@ip:port -localpath="本地路径" -remotepath="远程FTP上的路 ...
- 抓取Js动态生成数据且以滚动页面方式分页的网页
代码也可以从我的开源项目HtmlExtractor中获取. 当我们在进行数据抓取的时候,如果目标网站是以Js的方式动态生成数据且以滚动页面的方式进行分页,那么我们该如何抓取呢? 如类似今日头条这样的网 ...