多边形切割模板
2016-08-23 12:02
169 查看
//多边形切割 //可用于半平面交 #define MAXN 100 #define eps 1e-8 #define zero(x) (((x)>0?(x):-(x))<eps) struct point{double x,y;}; double xmult(point p1,point p2,point p0){ return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y); } int same_side(point p1,point p2,point l1,point l2){ return xmult(l1,p1,l2)*xmult(l1,p2,l2)>eps; } point intersection(point u1,point u2,point v1,point v2){ point ret=u1; double t=((u1.x-v1.x)*(v1.y-v2.y)-(u1.y-v1.y)*(v1.x-v2.x)) /((u1.x-u2.x)*(v1.y-v2.y)-(u1.y-u2.y)*(v1.x-v2.x)); ret.x+=(u2.x-u1.x)*t; ret.y+=(u2.y-u1.y)*t; return ret; } //将多边形沿l1,l2确定的直线切割在side侧切割,保证l1,l2,side不共线 void polygon_cut(int& n,point* p,point l1,point l2,point side){ point pp[100]; int m=0,i; for (i=0;i<n;i++){ if (same_side(p[i],side,l1,l2)) pp[m++]=p[i]; if (!same_side(p[i],p[(i+1)%n],l1,l2)&&!(zero(xmult(p[i],l1,l2))&&zero(xmult(p[(i+1)%n],l1,l2)))) pp[m++]=intersection(p[i],p[(i+1)%n],l1,l2); } for (n=i=0;i<m;i++) if (!i||!zero(pp[i].x-pp[i-1].x)||!zero(pp[i].y-pp[i-1].y)) p[n++]=pp[i]; if (zero(p[n-1].x-p[0].x)&&zero(p[n-1].y-p[0].y)) n--; if (n<3) n=0; }
相关文章推荐
- hdu2892-area 求园和多边形的相交面积模板题
- poj3335-Rotating Scoreboard 判断多边形是否有内核(模板题)
- LightOj1190 - Sleepwalking(判断点与多边形的位置关系--射线法模板)
- 【BZOJ1091】【Scoi2003】切割多边形 计算几何 状压DP
- 圆与多边形面积交模板
- sgu Theodore Roosevelt【判断点是否在凸多边形内模板】
- 简单多边形与圆相交模板
- Cupid's Arrow---hdu1756(判断点与多边形的位置关系 模板)
- sgu Theodore Roosevelt【判断点是否在凸多边形内模板】
- C# 实现 任意多边形切割折线算法
- hdu2306(模板可用于计算仍以多边形面积)
- 模板-多边形与圆的面积交
- hdu 3060 Area2(多边形的并模板题)
- 摘:向量叉乘_计算多边形面积_算法模板
- bzoj1091: [SCOI2003]切割多边形
- arcgis切割多边形以及合并多边形
- 三维计算几何模板--表面三角形个数 表面多边形个数 三维凸包 表面积 凸包重心 点到面的距离
- 多边形和圆的相交面积(模板)hdu2892、hdu4404
- 3dmax 切割 编辑多边形
- UVA 634 Polygon(模板题:判定点在多边形内)