问题描述:已知两个多边形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. 1 累加和求重心 设平面上有N 个离散数据点( xi , yi ) ( i = 1, 2, ., n) , 其 多边形重心G( . x1, . y1) 为: 这是求 ...

  2. 计算几何——多边形和圆相交的面积

    汇总篇:计算几何汇总 原文地址:https://www.cnblogs.com/lxglbk/archive/2012/08/12/2634192.html 代码部分为个人原创 圆与多变形相交的面积 ...

  3. POJ 3855 计算几何·多边形重心

    思路: 多边形面积->任选一个点,把多边形拆成三角,叉积一下 三角形重心->(x1+x2+x3)/3,(y1+y2+y3)/3 多边形重心公式题目中有,套一下就好了 计算多边形重心方法: ...

  4. 计算几何 多边形的交与并

    /** 多边形的交,多边形的边一定是要按逆时针方向给出* 还要判断是凸包还是凹包,调用相应的函数* 面积并,只要和面积减去交即可*/ #include <bits/stdc++.h> us ...

  5. LISP多边形形心计算公式_计算几何-多边形重心公式

    这是求多边形最简单直观的方法.可以直接利用离散数据点的 x, y 坐标就能求图形重心. 但是缺陷在于没有对离散数据点所围图形做任何处理和分析 , 精度不够. 1. 2 算法一:在讲该算法时,先要明白下 ...

  6. 76、多边形一些基本操作(自相交、尖刺、保证逆时针、求交)

    这里求交集采用的思路是找到内边,沿内边不断延展直到形成多边形 pro = """ 1.造一些多边形和一个大的范围 2.多边形交集部分归属问题 3.多边形未达部分归属问题 ...

  7. Deferred Shading,延迟渲染(提高渲染效率,减少多余光照计算)

    Deferred Shading,看过<Gems2> 的应该都了解了.最近很火的星际2就是使用了Deferred Shading. 原帖位置:    http://blog.csdn.ne ...

  8. Deferred Shading,延迟渲染(提高渲染效率,减少多余光照计算)【转】

    Deferred Shading,看过<Gems2> 的应该都了解了.最近很火的星际2就是使用了Deferred Shading. 原帖位置:    http://blog.csdn.ne ...

  9. 基于 Python 的自然邻域法空间插值的实现与思考

       自然邻域法是基于区域大小按比例对这些样本应用权重来进行插值 (Sibson 1981),该插值也称为 Sibson 或"区域占用 (area-stealing)"插值.其基本 ...

最新文章

  1. [na]tcpdump非常实用的抓包实例
  2. python 调用linux命令-Python 调用系统命令
  3. centos 7下独立的python 2.7环境安装
  4. 阿里云服务器win2003系统配置IIS+php+mysql+phpmyadmin+zend 500
  5. append,appendTo和prepend
  6. scrapy框架Selector提取数据
  7. Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结
  8. python入门学习—集合(FishC)
  9. 博客显示ip签名图片html代码,如何制作显示IP的签名图片
  10. 中小企业如何取舍OA办公系统的功能?
  11. Liunx 安装redis
  12. 我叔叔愿意从事计算机工作英语翻译,我的叔叔作文
  13. 教你怎样用Python进行语音识别!非常精准!
  14. 结构体中的函数指针(c语言里一种思想)
  15. Maltego详细安装及使用教程
  16. 解决:idea中tomcat项目改名后,原名项目启动后是新名项目的内容
  17. 多台计算机共享内存_共享内存多处理器和指令执行| 计算机架构
  18. java awt 玫瑰图形
  19. Struts2报错Caused by: java.lang.NoSuchMethodException: bean.Student.init()
  20. 中南大学汪炼成教授课题组:三维金属-半导体-金属AlN深紫外探测器

热门文章

  1. matlab将二值图像与原图重叠_[转载]图像处理matlab及图像融合图像镶嵌图像拼接...
  2. clickhouse官方文档_ClickHouse和他的朋友们(1)编译、开发、测试
  3. mysql出现1499错误_连接MySQL时出现1449与1045异常解决办法
  4. 虚拟电脑键盘app_说到弹吉他,这几个APP你一定用得上
  5. 判断objcet是否是map类型_57、递归+树的深度+map-二叉搜索树的平衡性
  6. 列标题 如何删除gridcontrol_DEV控件GridControl常用属性设置(转)
  7. python opencv教程rtsp server_Python多进程opencv调用rtsp视频流
  8. 30、【华为HCIE-Storage】--Hyper Metro(双活【块业务】)
  9. 获取json格式字符串的简单方法
  10. Bilateral Filtering(双边滤波) for SSAO(转)