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祭才做的水题 题意: 很直白的的题意啊,就是求任意一个多边形的面积 所以我们来安利一下一个求多边形面积的数学通式: 给定多边形的顶点坐标(有序),让你来求这个多边形的面 ...
随机推荐
- android使用其他应用打开文件
根据文件的MIME类型来判断,手机中有哪些应用可以打开这个文件,然后把应用在弹窗列表中显示 /** * 打开文件 * * @param file */ public static void openF ...
- Java获取当前第几周【转】
本文copy自:http://swxzqsd.blog.sohu.com/156208509.html 作者:camelcanoe String today = "2010-01-11&qu ...
- 在IE6下使用filter设置png背景
今天帮别人解决问题学会了一个在IE6下使用filter设置png背景,具体css写法如下: .login_form_wrap { width: 778px; height: 360px; backgr ...
- Robberies(简单的01背包 HDU2955)
Robberies Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- hiho 第116周,最大流最小割定理,求最小割集S,T
小Hi:在上一周的Hiho一下中我们初步讲解了网络流的概念以及常规解法,小Ho你还记得内容么? 小Ho:我记得!网络流就是给定了一张图G=(V,E),以及源点s和汇点t.每一条边e(u,v)具有容量c ...
- Python科学计算环境推荐——Anaconda
最近在用Python做中文自然语言处理.使用的IDE是PyCharm.PyCharm确实是Python开发之首选,但用于科学计算方面,还略有欠缺.为此我尝试过Enthought Canopy,但Can ...
- C# 对Xml的常用操作
using System.Xml; //初始化一个xml实例 XmlDocument xml=new XmlDocument(); //导入指定xml文件 xml.Load(path); ...
- 2016年12月8日 星期四 --出埃及记 Exodus 21:3
2016年12月8日 星期四 --出埃及记 Exodus 21:3 If he comes alone, he is to go free alone; but if he has a wife wh ...
- 在JSP页面显示九九乘法表
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- 建立exception包,编写TestException.java程序,主方法中有以下代码,确定其中可能出现的异常,进行捕获处理。
package exception; public class TestException { public static void main(String[] args) { for(int i=0 ...