[HDU 3060] Area2 (简单多边形面积交)

2024-06-21 19:38

本文主要是介绍[HDU 3060] Area2 (简单多边形面积交),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

HDU - 3060

给定两个简单多边形,求他们覆盖的面积


先求出两个简单多边形的面积交
然后用面积和减去面积交
简单多边形面积交的求法就是将多边形分割成若干三角形
然后两组三角形用凸多边形的方法两两求交

#pragma comment(linker, "/STACK:102400000,102400000")
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cctype>
#include <map>
#include <set>
#include <queue>
#include <bitset>
#include <string>
#include <complex>
using namespace std;
typedef pair<int,int> Pii;
typedef long long LL;
typedef unsigned long long ULL;
typedef double DBL;
typedef long double LDBL;
#define MST(a,b) memset(a,b,sizeof(a))
#define CLR(a) MST(a,0)
#define SQR(a) ((a)*(a))
#define PCUT puts("\n----------")const int maxn=500+10;
const DBL eps=1e-8;
int sgn(DBL x){return x>eps? 1: (x<-eps? -1: 0);}
struct Vector
{DBL x,y;Vector(DBL _x=0, DBL _y=0):x(_x),y(_y){}Vector operator + (const Vector &rhs) const {return Vector(x+rhs.x, y+rhs.y);}Vector operator - (const Vector &rhs) const {return Vector(x-rhs.x, y-rhs.y);}Vector operator * (const DBL &rhs) const {return Vector(x*rhs, y*rhs);}Vector operator / (const DBL &rhs) const {return Vector(x/rhs, y/rhs);}DBL operator * (const Vector &rhs) const {return x*rhs.x + y*rhs.y;}DBL operator ^ (const Vector &rhs) const {return x*rhs.y - rhs.x*y;}int read(){return scanf("%lf%lf", &x, &y);}
};
typedef Vector Point;struct Line
{Point u,v;Line(){}Line(Point _u,Point _v):u(_u),v(_v){}
};
int N,M;
Point A[maxn], B[maxn];
DBL Area(int,Point*);
DBL CPIA(Point*,Point*,int,int);
DBL SPIA(Point*,Point*,int,int);int main()
{#ifdef LOCALfreopen("in.txt", "r", stdin);
//  freopen("out.txt", "w", stdout);#endifwhile(~scanf("%d%d", &N, &M)){for(int i=0; i<N; i++) A[i].read();for(int i=0; i<N; i++) B[i].read();printf("%.2f\n", Area(N,A)+Area(M,B)-SPIA(A,B,N,M));}return 0;
}DBL Area(int siz, Point p[])
{DBL res=0;split.for(int i=1; i<siz; i++) res += (p[i-1]^p[i]);res += (p[siz-1]^p[0]);return abs(res*0.5);
}Point GetLineIntSec(Line l1, Line l2)
{DBL a = (l1.v-l1.u)^(l2.u-l1.u), b = (l1.u-l1.v)^(l2.v-l1.v);if(sgn(a+b)==0) return Point(1e9,1e9);return Point((l2.u.x * b + l2.v.x * a) / (a + b), (l2.u.y * b + l2.v.y * a) / (a + b));
}DBL CPIA(Point a[], Point b[], int na, int nb)
{Point p[20], tmp[20]; // na,nb <=20int i, j, tn, sflag, eflag;a[na] = a[0], b[nb] = b[0];memcpy(p,b,sizeof(Point)*(nb + 1));for(i = 0; i < na && nb > 2; i++){sflag = sgn((a[i+1]-a[i])^(p[0]-a[i]));for(j = tn = 0; j < nb; j++, sflag = eflag){if(sflag>=0) tmp[tn++] = p[j];eflag = sgn( (a[i + 1]-a[i])^(p[j + 1]-a[i]));if((sflag ^ eflag) == -2)tmp[tn++] = GetLineIntSec( Line(a[i], a[i + 1]) , Line(p[j], p[j + 1]));}memcpy(p, tmp, sizeof(Point) * tn);nb = tn, p[nb] = p[0];}if(nb < 3) return 0.0;return Area(nb, p);
}DBL SPIA(Point a[], Point b[], int na, int nb)
{int i, j;Point t1[4], t2[4];double res = 0, num1, num2;a[na] = t1[0] = a[0], b[nb] = t2[0] = b[0];for(i = 2; i < na; i++){t1[1] = a[i-1], t1[2] = a[i];num1 = sgn( (t1[1]-t1[0])^(t1[2]-t1[0]));if(num1 < 0) swap(t1[1], t1[2]);for(j = 2; j < nb; j++){t2[1] = b[j - 1], t2[2] = b[j];num2 = sgn((t2[1]-t2[0])^(t2[2]-t2[0]));if(num2 < 0) swap(t2[1], t2[2]);res += CPIA(t1, t2, 3, 3) * num1 * num2;}}return res;
}

这篇关于[HDU 3060] Area2 (简单多边形面积交)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1082148

相关文章

一份LLM资源清单围观技术大佬的日常;手把手教你在美国搭建「百万卡」AI数据中心;为啥大模型做不好简单的数学计算? | ShowMeAI日报

👀日报&周刊合集 | 🎡ShowMeAI官网 | 🧡 点赞关注评论拜托啦! 1. 为啥大模型做不好简单的数学计算?从大模型高考数学成绩不及格说起 司南评测体系 OpenCompass 选取 7 个大模型 (6 个开源模型+ GPT-4o),组织参与了 2024 年高考「新课标I卷」的语文、数学、英语考试,然后由经验丰富的判卷老师评判得分。 结果如上图所

回调的简单理解

之前一直不太明白回调的用法,现在简单的理解下 就按这张slidingmenu来说,主界面为Activity界面,而旁边的菜单为fragment界面。1.现在通过主界面的slidingmenu按钮来点开旁边的菜单功能并且选中”区县“选项(到这里就可以理解为A类调用B类里面的c方法)。2.通过触发“区县”的选项使得主界面跳转到“区县”相关的新闻列表界面中(到这里就可以理解为B类调用A类中的d方法

自制的浏览器主页,可以是最简单的桌面应用,可以把它当成备忘录桌面应用

自制的浏览器主页,可以是最简单的桌面应用,可以把它当成备忘录桌面应用。如果你看不懂,请留言。 完整代码: <!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><ti

python实现最简单循环神经网络(RNNs)

Recurrent Neural Networks(RNNs) 的模型: 上图中红色部分是输入向量。文本、单词、数据都是输入,在网络里都以向量的形式进行表示。 绿色部分是隐藏向量。是加工处理过程。 蓝色部分是输出向量。 python代码表示如下: rnn = RNN()y = rnn.step(x) # x为输入向量,y为输出向量 RNNs神经网络由神经元组成, python

宝塔面板部署青龙面板教程【简单易上手】

首先,你得有一台部署了宝塔面板的服务器(自己用本地电脑也可以)。 宝塔面板部署自行百度一下,很简单,这里就不走流程了,官网版本就可以,无需开心版。 首先,打开宝塔面板的软件商店,找到下图这个软件(Docker管理器)安装,青龙面板还是安装在docker里,这里依赖宝塔面板安装和管理docker。 安装完成后,进入SSH终端管理,输入代码安装青龙面板。ssh可以直接宝塔里操作,也可以安装ssh连接

XMG Quartz2D的简单使用

// //  Quratz2DView.m //  Quartz2D // //  Created by 王宁 on 16/5/6. //  Copyright © 2016年 ylshmacmini. All rights reserved. // #import "Quratz2DView.h" //Quartz@2D是一个二维绘图引擎,同时支

网页脚本输入这么简单

如何在网页中进行脚本操作呢? 研究了一下,很简单,用google浏览器的Console直接操作javaScript。思路: Created with Raphaël 2.1.0 开始 输入(如何输入) 点击(如何点击) 结束 下面是,通过脚本刷直播屏的实现,直接在Console输入即可 var words=new Arra

Linux网络编程之简单并发服务器

1.概念 与前面介绍的循环服务器不同,并发服务器对服务请求并发处理。而循环服务器只能够一个一个的处理客户端的请求,显然效率很低. 并发服务器通过建立多个子进程来实现对请求的并发处理,但是由于不清楚请求客户端的数目,因此很难确定子进程的数目。因此可以动态增加子进程与事先分配的子进程相结合的方法来实现并发服务器。 2. 算法流程 (1)TCP简单并发服务器:     服务器子进程1:

上海邀请赛 A题目 HDU 5236(dp)

先求出没有ctrl+s的时候构造长度为i的期望f[i] 。然后枚举保存的次数,求出最小即可。 #include<cstdio>#include<cstdio>#include<cmath>#include<queue>#include<stack>#include<string>#include<cstring>#include<iostream>#include<map>

hdu 2586 树上点对最近距离 (lca)

,只要知道dis[i][j]=dis[i][root]+dis[j][root]-2*dis[Lca(i,j)][root].   其中root为树的根节点,LCA(i,j)为i,j的最近公共祖先。 所以我们先把所有的询问储存下来,然后离线直接查询。复杂度是o(n+q)的。 VIE #include<cstdio>#include<algorithm>#include<i