【计算几何】多边形交集_weixin_34301307的博客-程序员宅基地

技术标签: c#  python  c/c++  

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34301307/article/details/86450787

智能推荐

phpcms后台栏目点击添加内容,报错500,解决方法。_ougexingfuba的博客-程序员宅基地

在后台添加文章内容时报错500,在网上找的一个帖子说是/phpcms/modules/content/fields/video/form.inc.php在上传至服务器时出现错误,果然发现服务器下的form.inc.php文件仅有2KB,而本地文件有8KB,把本地的覆盖过去以后就可以添加内容了。form.inc.php正常代码如下: function video($field, $value, $f...

WebView笔记一_鲜榨柠檬的博客-程序员宅基地

在这家公司做混合开发已经半年了,接触webview也半年了,期间也体验了crosswalk和TBS等三方,但也有各种各样的问题,最终还是选择了原生webview。对于这系列文章也早有心事,好记性不如烂笔头,但发表到网上又怕别人看到,因为自己理解不够误导大家,所以迟迟没有开始,但随着知识点越来越多,慢慢的就真的有东西记不住了,所以就抓紧写了这系列播客,如有错误请批评,如有帮助,不胜荣幸。
一、动

821. 字符的最短距离(C++)_pengshengli的博客-程序员宅基地

给定一个字符串 S 和一个字符 C。返回一个代表字符串 S 中每个字符到字符串 S 中的字符 C 的最短距离的数组。示例 1:输入: S = &quot;loveleetcode&quot;, C = 'e'输出: [3, 2, 1, 0, 1, 0, 0, 1, 2, 2, 1, 0]说明:字符串 S 的长度范围为 [1, 10000]。 C 是一个单字符,且保证是字符串 S 里的字符。 ...

bat批处理中使用数组示例_在PHP教程中使用示例计算数组长度_cunjiu9486的博客-程序员宅基地

bat批处理中使用数组示例PHP programming language provides the count(), sizeof() functions and foreach in order to count the elements in an array. The array can be a single dimension or multidimensional array.PH...

使用 Tungsten Replicator4 实现 mysql -- > mongodb 数据同步_chouji8455的博客-程序员宅基地

tungsten-replicator 技术交流群:376068310 一 规划主机: 192.168.67.128#mysql主机(事先安装好,mysql5.6)192.168.67.129#mongodb主机(事先安装好,mongodb3.0.6) 二 前置条件:(128...

Windows 7安全指南_博文视点的博客-程序员宅基地

本文选自《Windows 7安全指南》一书 前 言 很多人都认为,Windows操作系统的安全性太差。其实,对于新的Windows操作系统,例如Windows Vista/7,系统的安全性已经得到了空前的加强,然而依然有很多人在使用这些操作系统的时候因为安全问题而受到损失,到底是什么原因? 其实在计算机安全方面,也一直存在“木桶原理”,就像一只用木板拼成的木桶,桶里能装多少水,并不取决于最长的木板,而取决于其中最短的木板。可能操作系统本身已经很安全,但因为使用的人缺乏安全意识,也有可能导致操作系

随便推点

spring boot+layui的导入excel模板数据保存到数据库中_CCyyll_168的博客-程序员宅基地

html代码&amp;lt;button type=&quot;button&quot; class=&quot;layui-btn&quot; id=&quot;importFile&quot; shiro:hasAnyRoles=&quot;root,resourceManager&quot;&amp;gt;&amp;lt;i class=&quot;layui-icon&quot;&amp;gt;&amp;lt;/i&amp;gt;导入考勤模板&amp;lt;/button&amp;gt;j

idea切换分支出现的三个选项_码上农民的博客-程序员宅基地

我们在develop分支修改了代码,但是没有commit,所以在切换到其他分支的时候回弹出这个窗口.smart checkout 就会把冲突的这部分内容带到目的分支(如果你没有点进窗口的那些文件处理冲突的话)force checkout 就不会把冲突的这部分内容带到目的分支don't checkout当然是不切分支,继续留在当前分支了...

在线考试系统(Online Exam System)--ASP.NET_weixin_30823833的博客-程序员宅基地

用户设计 -|学生 -|老师 -|管理员学生结构设计 -|个人信息管理 -|修改个人信息 -|修改登录密码 -|选课中心 -|显示所有老师所开课的信息可进行选课 -|显示自己已选课程 -|在线考试 -|对已选老师开设的课程选择进行考试 -|成绩查...

采用深度学习算法为Spotify做基于内容的音乐推荐_西门仙忍的博客-程序员宅基地

【编者按】本文是比利时根特大学(Ghent University)的Reservoir Lab实验室博士研究生Sander Dieleman所撰写的博客文章,他的研究方向是音乐音频信号分类和推荐的层次表征学习,专攻深度学习和特征学习。以下为译文:2014年夏天,我在 网络音乐平台Spotify (纽约)实习, 致力于使用卷积神经网络 (convolutional neural networ

11月平均工资下来,程序员心态崩了!_Python进阶者的博客-程序员宅基地

科技飞速发展的今天,企业对候选人有了新的更高要求,如市场、运营等必须会Python、Sql,面试常问诸如用户漏斗等考察数据分析能力。可以说,懂数据的人会更有竞争力通过面试。而市场上,专业...

fork后进程的执行开始位置_helo_beaver的博客-程序员宅基地

linux  fork后的子进程从fork处开始执行

推荐文章

热门文章

相关标签