求多边形的核(模板)
来源:互联网 发布:开票系统数据更新失败 编辑:程序博客网 时间:2024/05/29 14:00
Poj 3335
#include<iostream>#include <stdio.h>#include <math.h>#define eps 1e-8using namespace std;const int MAXN=105;int m;double r;int cCnt,curCnt;//此时cCnt为最终切割得到的多边形的顶点数、暂存顶点个数struct point{ double x,y;};point points[MAXN],p[MAXN],q[MAXN];//读入的多边形的顶点(顺时针)、p为存放最终切割得到的多边形顶点的数组、暂存核的顶点void getline(point x,point y,double &a,double &b,double &c){//两点x、y确定一条直线a、b、c为其系数 a = y.y - x.y; b = x.x - y.x; c = y.x * x.y - x.x * y.y;}void initial(){ for(int i = 1; i <= m; ++i)p[i] = points[i]; p[m+1] = p[1]; p[0] = p[m]; cCnt = m;//cCnt为最终切割得到的多边形的顶点数,将其初始化为多边形的顶点的个数}point intersect(point x,point y,double a,double b,double c){//求x、y形成的直线与已知直线a、b、c、的交点 double u = fabs(a * x.x + b * x.y + c); double v = fabs(a * y.x + b * y.y + c); point pt; pt.x=(x.x * v + y.x * u) / (u + v); pt.y=(x.y * v + y.y * u) / (u + v); return pt;}void cut(double a,double b ,double c){ curCnt = 0; for(int i = 1; i <= cCnt; ++i){ if(a*p[i].x + b*p[i].y + c >= 0)q[++curCnt] = p[i];// c由于精度问题,可能会偏小,所以有些点本应在右侧而没在, //故应该接着判断 else { if(a*p[i-1].x + b*p[i-1].y + c > 0){//如果p[i-1]在直线的右侧的话, //则将p[i],p[i-1]形成的直线与已知直线的交点作为核的一个顶点(这样的话,由于精度的问题,核的面积可能会有所减少) q[++curCnt] = intersect(p[i],p[i-1],a,b,c); } if(a*p[i+1].x + b*p[i+1].y + c > 0){//原理同上 q[++curCnt] = intersect(p[i],p[i+1],a,b,c); } } } for(int i = 1; i <= curCnt; ++i)p[i] = q[i];//将q中暂存的核的顶点转移到p中 p[curCnt+1] = q[1];p[0] = p[curCnt]; cCnt = curCnt;}void solve(){ //注意:默认点是顺时针,如果题目不是顺时针,规整化方向 initial(); for(int i = 1; i <= m; ++i){ double a,b,c; getline(points[i],points[i+1],a,b,c); cut(a,b,c); } /* 如果要向内推进r,用该部分代替上个函数 for(int i = 1; i <= m; ++i){ Point ta, tb, tt; tt.x = points[i+1].y - points[i].y; tt.y = points[i].x - points[i+1].x; double k = r / sqrt(tt.x * tt.x + tt.y * tt.y); tt.x = tt.x * k; tt.y = tt.y * k; ta.x = points[i].x + tt.x; ta.y = points[i].y + tt.y; tb.x = points[i+1].x + tt.x; tb.y = points[i+1].y + tt.y; double a,b,c; getline(ta,tb,a,b,c); cut(a,b,c); }*/ /* //多边形核的面积 double area = 0; for(int i = 1; i <= curCnt; ++i) area += p[i].x * p[i + 1].y - p[i + 1].x * p[i].y; area = fabs(area / 2.0); */}/*void GuiZhengHua(){ //规整化方向,逆时针变顺时针,顺时针变逆时针 for(int i = 1; i < (m+1)/2; i ++) swap(points[i], points[m-i]);}*/int main(){ int t; cin>>t; while(t--) { cin>>m; int i; for(i=1;i<=m;i++)cin>>points[i].x>>points[i].y; points[m+1]=points[1]; solve(); if(cCnt<1)cout<<"NO"<<endl; else cout<<"YES"<<endl; }}
0 0
- 求多边形的核(模板)
- 求多边形的面积(模板)
- 透彻解析半平面交求多边形的核模板
- 求两个多边形的交面积(模板)
- hdu1115(求多边形重心模板)
- 求多边形内的最大的圆半径模板
- 求三角形重心 包括凹多边形的模板
- POJ1279 && LA2512 Art Gallery(求多边形的核)
- poj-3130-3335-求多边形的核
- 求多边形的面积
- 几何(多边形模板)
- 【多边形面积】求多边形的面积 pol
- hdu2892-area 求园和多边形的相交面积模板题
- HDOJ2892 求多边形和圆相交面积 最简单的模板程序
- 如何求多边形的重心
- HDOJ2036 求多边形的面积
- 求任意多边形的面积
- 求面积最小的多边形
- 将一个long型的数字转化为字节数组(利用IO流)
- 为什么TCP连接需要三次握手?
- android studio 使用记录
- C#控制台 Trim 删除字符串首字母前面的空格与尾字母后面的空格
- HDU 5088 Revenge of Nim II(尼姆博弈,高斯消元)
- 求多边形的核(模板)
- UIfont字号与像素对应表
- Jersey构建REST服务实战
- Oracle分页查询综合示例
- JavaWeb入门之B/S架构与C/S架构区别
- 分治法解决选择问题——找出第i小的元素
- GZIP压缩原理分析(21)——第五章 Deflate算法详解(五12) 动态哈夫曼编码分析(01) 本节说明
- [php学习十五]javaScript的基本练习5-Cookie
- Java 类加载回顾