博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 3335 Rotating Scoreboard 半平面交
阅读量:6406 次
发布时间:2019-06-23

本文共 1646 字,大约阅读时间需要 5 分钟。

求多边形的核

#include 
#include
#include
#define eps 1e-18using namespace std;const int MAXN = 105;double a, b, c;int n, cnt;struct Point{ double x, y;}point[MAXN], p[MAXN], tp[MAXN];void Get_equation(Point p1, Point p2){ a = p2.y - p1.y; b = p1.x - p2.x; c = p2.x * p1.y - p1.x * p2.y;}Point Intersection(Point p1, Point p2){ double u = fabs(a * p1.x + b * p1.y + c); double v = fabs(a * p2.x + b * p2.y + c); Point t; t.x = (p1.x * v + p2.x * u) / (u + v); t.y = (p1.y * v + p2.y * u) / (u + v); return t;}void Cut(){ int tmp = 0; for(int i=1; i<=cnt; i++) { //顺时针是>-eps和>eps,逆时针是
<-eps if(a * p[i].x + b * p[i].y + c > -eps) tp[++tmp] = p[i]; else { if(a * p[i-1].x + b * p[i-1].y + c > eps) tp[++tmp] = Intersection(p[i-1], p[i]); if(a * p[i+1].x + b * p[i+1].y + c > eps) tp[++tmp] = Intersection(p[i], p[i+1]); } } for(int i=1; i<=tmp; i++) p[i] = tp[i]; p[0] = p[tmp]; p[tmp+1] = p[1]; cnt = tmp;}void solve(){ for(int i=1; i<=n; i++) p[i] = point[i]; point[n+1] = point[1]; p[0] = p[n]; p[n+1] = p[1]; cnt = n; for(int i=1; i<=n; i++) { Get_equation(point[i], point[i+1]); Cut(); }}int main(){ int T; scanf("%d", &T); while(T--) { scanf("%d", &n); for(int i=1; i<=n; i++) scanf("%lf%lf", &point[i].x, &point[i].y); solve(); puts(cnt > 0? "YES" : "NO"); } return 0;}

 

转载于:https://www.cnblogs.com/pach/p/7458229.html

你可能感兴趣的文章
IDEA项目上传到github
查看>>
开源大数据周刊-第62期
查看>>
Java反射 动态类加载和重载
查看>>
JavaScript函数无重载
查看>>
5.Hibernate工具类的简易封装
查看>>
JDK8 类和接口的多继承
查看>>
微信小程序下拉刷新与上拉加载
查看>>
【思维导图】深入理解HTTPS原理、过程
查看>>
BCH生态建设逐步完善,商家接受度明显提高
查看>>
vue.js @慕课网
查看>>
看一下,Java面试中常被问到的几大技术难题!
查看>>
关于Redisson分布式事务锁
查看>>
Kubernetes平台的安装详解
查看>>
基于 Webpack4 的可插拔式微前端架构 - Puzzle
查看>>
每周一个前端动画之一:UC浏览器球队展示动画的实现
查看>>
看完这篇文章,我保证你也会用 RoundedBitmapDrawable 创建圆角头像
查看>>
[译] 浏览器中 CSS 支持指南
查看>>
学习2.0高仿饿了么遇到的坑-v-el指令2.0已经废弃了,要使用 ref 特殊属性。
查看>>
(JS基础)DOM:样式
查看>>
《基础入门之我的第一张驾驶舱》技巧整理
查看>>