GYM 101673 A - Abstract Art 多个一般多边形面积并
#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define PLL pair<LL, LL>
#define PLI pair<LL, int>
#define PII pair<int, int>
#define SZ(x) ((int)x.size())
#define ull unsigned long long using namespace std; const int N = 1e5 + ;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + ;
const double eps = 1e-;
const double PI = acos(-); struct Point {
double x, y;
Point(double x = , double y = ) : x(x), y(y) { } };
typedef Point Vector;
int dcmp(double x) {
if(fabs(x) < eps) return ;
else return x < ? - : ;
}
Point operator + (Vector A, Vector B) {return Point(A.x + B.x, A.y + B.y);}
Point operator - (Vector A, Vector B) {return Point(A.x - B.x, A.y - B.y);}
Point operator * (Vector A, double p) {return Point(A.x * p, A.y * p);}
Point operator / (Vector A, double p) {return Point(A.x / p, A.y / p);}
bool operator < (const Vector &A, const Vector &B) {return A.y < B.y || (A.y == B.y && A.x < B.x);}
bool operator == (const Vector &A, const Point &B) {return dcmp(A.x - B.x) == && dcmp(A.y - B.y) == ;}
double Dot(Vector A, Vector B) {return A.x * B.x + A.y * B.y;}
double Length(Vector A) {return sqrt(Dot(A, A));}
double Angle(Vector A, Vector B) {return acos(Dot(A, B) / Length(A) / Length(B));}
double Cross(Vector A, Vector B) {return A.x * B.y - A.y * B.x;}
double Area2(Point A, Point B, Point C) {return Cross(B - A, C - A);} double PolygonArea(vector<Point>& p) {
int n = p.size();
double area = ;
for(int i = ; i < n - ; i++)
area += Cross(p[i]-p[], p[i+]-p[]);
return fabs(area / );
} double Seg(Point O, Point A, Point B){
if(dcmp(B.x - A.x) == ) return (O.y - A.y) / (B.y - A.y);
return (O.x - A.x) / (B.x - A.x);
} double MultiPolyArea(vector<Point>* p, int n) {
double res=;
vector<pair<double, int>> s;
for(int i = ; i < n; i++) {
int sz = p[i].size();
for(int j = ; j < sz; j++){
s.clear();
s.push_back(mk(, ));
s.push_back(mk(, ));
Point a = p[i][j], b = p[i][(j+)%sz];
for(int k = ; k < n; k++){
if(i != k){
int sz2 = p[k].size();
for(int z = ; z < sz2; z++){
Point c = p[k][z], d = p[k][(z+)%sz2];
int c1 = dcmp(Cross(b-a, c-a));
int c2 = dcmp(Cross(b-a, d-a));
if(c1 == && c2 == ) {
if(dcmp(Cross(b-a, d-c))) {
s.push_back(mk(Seg(c, a, b), ));
s.push_back(mk(Seg(c, a, b), -));
}
} else {
double s1 = Cross(d-c, a-c), s2 = Cross(d-c, b-c);
if(c1 >= && c2 < ) s.push_back(mk(s1/(s1-s2), ));
else if(c1 < && c2 >= ) s.push_back(mk(s1/(s1-s2), -));
}
}
}
}
sort(s.begin(), s.end());
double pre = min(max(s[].fi, 0.0), 1.0), now, sum=;
int cov = s[].se;
for(int j = ; j < s.size(); j++) {
now = min(max(s[j].fi, 0.0), 1.0);
if(!cov) sum += now - pre;
cov += s[j].second;
pre = now;
}
res += Cross(a, b) * sum;
}
}
return fabs(res / );
} int n, m;
vector<Point> poly[]; int main() {
scanf("%d", &n);
for(int i = ; i < n; i++) {
scanf("%d", &m);
poly[i].resize(m);
for(int j = ; j < m; j++) {
scanf("%lf%lf", &poly[i][j].x, &poly[i][j].y);
}
}
double ans1 = , ans2 = MultiPolyArea(poly, n);
for(int i = ; i < n; i++) ans1 += PolygonArea(poly[i]);
printf("%.12f %.12f\n", ans1, ans2);
return ;
} /*
*/
GYM 101673 A - Abstract Art 多个一般多边形面积并的更多相关文章
- Gym - 101673:B Craters (几何,求凸包)
题意:给定几个圆,求最短的围合,把这几个包围起来,而且到圆的距离都不小于10. 思路:把每个圆的半径+10,边等分5000份,然后求凸包即可. #include<bits/stdc++.h> ...
- Gym-101673: A Abstract Art (模板,求多个多边形的面积并)
手抄码板大法. #include<bits/stdc++.h> using namespace std; #define mp make_pair typedef long long ll ...
- Gym - 101208J 2013 ACM-ICPC World Finals J.Pollution Solution 圆与多边形面积交
题面 题意:给你一个半圆,和另一个多边形(可凹可凸),求面积交 题解:直接上板子,因为其实这个多边形不会穿过这个半圆,所以他和圆的交也就是和半圆的交 打的时候队友说凹的不行,不是板题,后面想想,圆与多 ...
- POJ 1279 Art Gallery 半平面交/多边形求核
http://poj.org/problem?id=1279 顺时针给你一个多边形...求能看到所有点的面积...用半平面对所有边取交即可,模版题 这里的半平面交是O(n^2)的算法...比较逗比.. ...
- POJ 1279 Art Gallery 半平面交 多边形的核
题意:求多边形的核的面积 套模板即可 #include <iostream> #include <cstdio> #include <cmath> #define ...
- Gerald is into Art
Gerald is into Art Gerald bought two very rare paintings at the Sotheby's auction and he now wants t ...
- Codeforces Round #313 (Div. 2)B.B. Gerald is into Art
B. Gerald is into Art Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset/ ...
- CodeForces 560B Gerald is into Art
Gerald is into Art time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- Codeforces Round #313 (Div. 2) B. Gerald is into Art 水题
B. Gerald is into Art Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/560 ...
随机推荐
- C# 使用ffmpeg视频截图
<appSettings> <add key="ffmpeg" value="E:\ffmpeg\ffmpeg-20141012-git-20df026 ...
- pip 报错
pip 安装 初始化系统 安装PiP 问题? 依赖包:yun install wget gcc gcc-c++ -y python 环境 wget http://www.python.org/ftp/ ...
- vue学习之用 Vue.js + Vue Router 创建单页应用的几个步骤
通过vue学习一:新建或打开vue项目,创建好项目后,接下来的操作为: src目录重新规划——>新建几个页面——>配置这几个页面的路由——>给根实例注入路由配置 src目录重整 在项 ...
- jenkins配置sonarqube
jenkins配置sonarqube 下载插件SonarQube Scanner for Jenkins 在系统管理系统设置中选择 SonarQube servers 配置服务器名称.访问URL地址, ...
- 关于Laravel 无法下载的问题
今天在git bush用composer安装laravel5.5卡住了,无法下载 解决办法:更换到国内源,就可以下载了 运行命令: composer config -g repo.packagist ...
- JavaScript学习 - 基础(七) - DOM event(事件)
DOM event(事件) 定义事件: // 定义事件: //方式一,直接在标签上定义事件 // 方式二: var a11 = document.getElementsByName('a11')[0] ...
- Protues常用元器件查找对应表
原理图常用库文件:Miscellaneous Devices.ddbDallas Microprocessor.ddbIntel Databooks.ddbProtel DOS Schematic L ...
- 【转】Python数据类型之“序列概述与基本序列类型(Basic Sequences)”
[转]Python数据类型之“序列概述与基本序列类型(Basic Sequences)” 序列是指有序的队列,重点在"有序". 一.Python中序列的分类 Python中的序列主 ...
- if-else 重构
最近发现自己写的代码if else太多了,有时候自己回头看都要重新捋逻辑,很不好.决定深入理解下if else重构. 中心思想: ①不同分支应当是同等层次,内容相当. ②合并条件表达式,减少if语句数 ...
- freeRTOS中文实用教程3--中断管理之中断嵌套
1.前言 最新的 FreeRTOS 移植中允许中断嵌套.中断嵌套需要在 FreeRTOSConfig.h 中设置configKERNEL_INTERRUPT_PRIORITY 和configMAX_S ...