【计算几何】多边形交集

问题描述:已知两个多边形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

时间: 2025-01-04 22:34:17

【计算几何】多边形交集的相关文章

POJ 1385 计算几何 多边形重心

链接: http://poj.org/problem?id=1385 题意: 给你一个多边形,求它的重心 题解: 模板题,但是不知道为啥我的结果输出的确是-0.00 -0.00 所以我又写了个 if (ans.x == 0) ans.x = 0 感觉好傻逼 代码: 1 #include <map> 2 #include <set> 3 #include <cmath> 4 #include <queue> 5 #include <stack> 6

boost多边形交集、并集

交集:http://www.boost.org/doc/libs/1_56_0/libs/geometry/doc/html/geometry/reference/algorithms/intersection.html 并集:http://www.boost.org/doc/libs/1_56_0/libs/geometry/doc/html/geometry/reference/algorithms/union_.html boost geometry下载地址:https://svn.boo

POJ 1265 计算几何 多边形面积 内部格点数 边上格点数

链接: http://poj.org/problem?id=1265 题意: 给你一个多边形,求它的面积,内部格点数目,边上格点数目 题解: pick公式: 给定顶点坐标均是整数点的简单多边形,有 面积=内部格点数目+边上格点数目/2+1 边界上的格点数: 把每条边当做左开右闭的区间以避免重复,一条左开右闭的线段(x1,y1)->(x2,y2)上的格点数为: gcd(x2-x1,y2-y1). 代码: 1 #include <map> 2 #include <set> 3 #

旋转卡壳总结

[+] 目录(?)[+] 以下所有文章均转载( http://blog.csdn.net/acmaker/article/details/3176910) 转载请注明出处! 1.旋转卡壳——翻译说明文档 前一段时间看了一位国外大牛的网站,是关于旋转卡壳技术的,内容很不错,就尝试着翻译一下. 关于旋转卡壳技术,最早是在刘汝佳.黄亮的<算法艺术与信息学竞赛>上看到的,是计算几何相关的技术,开始觉得很神奇,因为其对于凸多边形的问题给出了很好的解决方案,于是上网查了一下,就发现了这份资料. 通过个人的

计算两幅图像的重叠区域

http://www.cnblogs.com/dwdxdy/p/3232331.html 随笔- 87  文章- 0  评论- 81 [OpenCV学习]计算两幅图像的重叠区域 问题描述:已知两幅图像Image1和Image2,计算出两幅图像的重叠区域,并在Image1和Image2标识出重叠区域. 算法思想: 若两幅图像存在重叠区域,则进行图像匹配后,会得到一张完整的全景图,因而可以转换成图像匹配问题. 图像匹配问题,可以融合两幅图像,得到全景图,但无法标识出在原图像的重叠区域. 将两幅图像都

【OpenCV学习】计算两幅图像的重叠区域

问题描述:已知两幅图像Image1和Image2,计算出两幅图像的重叠区域,并在Image1和Image2标识出重叠区域. 算法思想: 若两幅图像存在重叠区域,则进行图像匹配后,会得到一张完整的全景图,因而可以转换成图像匹配问题. 图像匹配问题,可以融合两幅图像,得到全景图,但无法标识出在原图像的重叠区域. 将两幅图像都理解为多边形,则其重叠区域的计算,相当于求多边形的交集. 通过多边形求交,获取重叠区域的点集,然后利用单应矩阵还原在原始图像的点集信息,从而标识出重叠区域. 算法步骤: 1.图像

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

Deferred Shading,看过<Gems2> 的应该都了解了.最近很火的星际2就是使用了Deferred Shading. 原帖位置:   http://blog.csdn.net/noslopforever/archive/2009/03/03/3951273.aspx 这篇文章是对GEMS2里<Deferred Shading in S.T.A.L.K.E.R.>(中文译名<S.T.A.L.K.E.R.中的延期着色>,原作者Oles Shishkovtsov

常见算法动画

这里是地址    http://de.visualgo.net/ 7    VisuAlgo   开始训练!   这是中文的网站 http://visualgo.net. 请参阅本文更多详情. en zh ru id bn ja de ko vi th nl .VisuAlgo.net 数据结构和算法动态可视化 (Chinese) 排序 冒泡选择插入归并快速随机快速选择插入计数基数排序cs2020cs1020cs1010cs3230数组链表数据结构算法排序 位运算 位操作布尔值数组小型集合cs3

【计算几何】多边形

2.多边形  (polygon.pas/c/cpp) [问题描述] 在平面直角坐标系中给出一个顶点横纵坐标均为整数的简单多边形[1],求在这个多边形内部有多少个横纵坐标均为整数的点. [输入] 输入文件名为polygon.in,共 行,第一行包含一个正整数 . 下面共 行,每行包含两个整数 ,依次表示多边形顶点的坐标,顶点按照逆时针顺序给出. [输出] 输出文件名为polygon.out,共一行,包含一个非负整数,表示多边形内部的整点个数. [输入输出样例] polygon.in polygon