【计算几何】多边形交集
问题描述:已知两个多边形Poly1和Poly2,分别由点集C1={P1,P2,...,Pm}和C2={Q1,Q2,...,Qn}表示,求这两个多边形的交集。
算法思想:
两个多边形相交后,其顶点要么是两个多边形边的交点,要么是在多边形内部的点。
算法步骤:
1.计算两个多边形每条边之间的交点。
2.计算包含在多边形内部的点。
3.将交点和多边形内部的点,按逆时针(或顺时针)排序,得出最终的点集。
代码基本实现如下:
1 typedef struct Point 2 { 3 int x; 4 int y; 5 }Point; 6 bool PolygonClip(const vector<Point> &poly1,const vector<Point> &poly2, std::vector<Point> &interPoly) 7 { 8 if (poly1.size() < 3 || poly2.size() < 3) 9 { 10 return false; 11 } 12 13 long x,y; 14 //计算多边形交点 15 for (int i = 0;i < poly1.size();i++) 16 { 17 int poly1_next_idx = (i + 1) % poly1.size(); 18 for (int j = 0;j < poly2.size();j++) 19 { 20 int poly2_next_idx = (j + 1) % poly2.size(); 21 if (GetCrossPoint(poly1[i],poly1[poly1_next_idx], 22 poly2[j],poly2[poly2_next_idx], 23 x,y)) 24 { 25 interPoly.push_back(cv::Point(x,y)); 26 } 27 } 28 } 29 30 //计算多边形内部点 31 for(int i = 0;i < poly1.size();i++) 32 { 33 if (IsPointInpolygon(poly2,poly1[i])) 34 { 35 interPoly.push_back(poly1[i]); 36 } 37 } 38 for (int i = 0;i < poly2.size();i++) 39 { 40 if (IsPointInpolygon(poly1,poly2[i])) 41 { 42 interPoly.push_back(poly2[i]); 43 } 44 } 45 46 if(interPoly.size() <= 0) 47 return false; 48 49 //点集排序 50 ClockwiseSortPoints(interPoly); 51 return true; 52 }
代码分析:
求多边形交集,主要由计算多边形交点、计算多边形内部点、点集排序三部分组成,主要由以下三个函数完成。
GetCrossPoint(),求线段交点,参考:http://www.cnblogs.com/dwdxdy/p/3230485.html
IsPointInpolygon(),判断点是否在多边形内部,参考:http://www.cnblogs.com/dwdxdy/p/3230647.html
ClockwiseSortPoints(),点集排序,参考:http://www.cnblogs.com/dwdxdy/p/3230156.html
参考资料:
http://blog.csdn.net/zxy_snow/article/details/6917501
转载于:https://www.cnblogs.com/dwdxdy/p/3232110.html
【计算几何】多边形交集相关推荐
- 【算法:数学】计算几何-多边形的重心
转载:计算几何-多边形的重心 1. 1 累加和求重心 设平面上有N 个离散数据点( xi , yi ) ( i = 1, 2, ., n) , 其 多边形重心G( . x1, . y1) 为: 这是求 ...
- 计算几何——多边形和圆相交的面积
汇总篇:计算几何汇总 原文地址:https://www.cnblogs.com/lxglbk/archive/2012/08/12/2634192.html 代码部分为个人原创 圆与多变形相交的面积 ...
- POJ 3855 计算几何·多边形重心
思路: 多边形面积->任选一个点,把多边形拆成三角,叉积一下 三角形重心->(x1+x2+x3)/3,(y1+y2+y3)/3 多边形重心公式题目中有,套一下就好了 计算多边形重心方法: ...
- 计算几何 多边形的交与并
/** 多边形的交,多边形的边一定是要按逆时针方向给出* 还要判断是凸包还是凹包,调用相应的函数* 面积并,只要和面积减去交即可*/ #include <bits/stdc++.h> us ...
- LISP多边形形心计算公式_计算几何-多边形重心公式
这是求多边形最简单直观的方法.可以直接利用离散数据点的 x, y 坐标就能求图形重心. 但是缺陷在于没有对离散数据点所围图形做任何处理和分析 , 精度不够. 1. 2 算法一:在讲该算法时,先要明白下 ...
- 76、多边形一些基本操作(自相交、尖刺、保证逆时针、求交)
这里求交集采用的思路是找到内边,沿内边不断延展直到形成多边形 pro = """ 1.造一些多边形和一个大的范围 2.多边形交集部分归属问题 3.多边形未达部分归属问题 ...
- Deferred Shading,延迟渲染(提高渲染效率,减少多余光照计算)
Deferred Shading,看过<Gems2> 的应该都了解了.最近很火的星际2就是使用了Deferred Shading. 原帖位置: http://blog.csdn.ne ...
- Deferred Shading,延迟渲染(提高渲染效率,减少多余光照计算)【转】
Deferred Shading,看过<Gems2> 的应该都了解了.最近很火的星际2就是使用了Deferred Shading. 原帖位置: http://blog.csdn.ne ...
- 基于 Python 的自然邻域法空间插值的实现与思考
自然邻域法是基于区域大小按比例对这些样本应用权重来进行插值 (Sibson 1981),该插值也称为 Sibson 或"区域占用 (area-stealing)"插值.其基本 ...
最新文章
- [na]tcpdump非常实用的抓包实例
- python 调用linux命令-Python 调用系统命令
- centos 7下独立的python 2.7环境安装
- 阿里云服务器win2003系统配置IIS+php+mysql+phpmyadmin+zend 500
- append,appendTo和prepend
- scrapy框架Selector提取数据
- Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结
- python入门学习—集合(FishC)
- 博客显示ip签名图片html代码,如何制作显示IP的签名图片
- 中小企业如何取舍OA办公系统的功能?
- Liunx 安装redis
- 我叔叔愿意从事计算机工作英语翻译,我的叔叔作文
- 教你怎样用Python进行语音识别!非常精准!
- 结构体中的函数指针(c语言里一种思想)
- Maltego详细安装及使用教程
- 解决:idea中tomcat项目改名后,原名项目启动后是新名项目的内容
- 多台计算机共享内存_共享内存多处理器和指令执行| 计算机架构
- java awt 玫瑰图形
- Struts2报错Caused by: java.lang.NoSuchMethodException: bean.Student.init()
- 中南大学汪炼成教授课题组:三维金属-半导体-金属AlN深紫外探测器
热门文章
- matlab将二值图像与原图重叠_[转载]图像处理matlab及图像融合图像镶嵌图像拼接...
- clickhouse官方文档_ClickHouse和他的朋友们(1)编译、开发、测试
- mysql出现1499错误_连接MySQL时出现1449与1045异常解决办法
- 虚拟电脑键盘app_说到弹吉他,这几个APP你一定用得上
- 判断objcet是否是map类型_57、递归+树的深度+map-二叉搜索树的平衡性
- 列标题 如何删除gridcontrol_DEV控件GridControl常用属性设置(转)
- python opencv教程rtsp server_Python多进程opencv调用rtsp视频流
- 30、【华为HCIE-Storage】--Hyper Metro(双活【块业务】)
- 获取json格式字符串的简单方法
- Bilateral Filtering(双边滤波) for SSAO(转)