多边形之间的交差并补....
以前接触二维图形的操作比较多,多边形之间的交差并补是一个难点,算法也颇为复杂,幸好有一些现成的源代码文件,比如这个gpc.c和gpc.h。
首先先将gpc.c和gpc.h加入到工程,我用的是mfc vc6.0(好古老)...需要将gpc.c改成gpc.cpp,然后添加到工程,似乎出现过一些问题,具体忘了,蛮简单最后配置成功,就可以用gpc的算法了。
整个文件不算难,很容易看懂,这里简单贴一下我写的代码,这个代码是一个多边形在另一多边形内部面积超过80%的时候,进行一系列操作。因此要求出两个多边形的交集。
首先我们先看一下求多边形面积的代码。
double CMap3DEditorDoc::det(gpc_vertex p0, gpc_vertex p1, gpc_vertex p2) { return (p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y)*(p2.x-p0.x); } double CMap3DEditorDoc::ploygon_area(int n,gpc_vertex p[]) { double s=0.0f; int i=1; for(;i < n-1;i++) s += det(p[0],p[i],p[i+1]); return 0.5*fabs(s); }
View Code
其中gpc_vertex在gpc.h中有解释,其实就是二维坐标点。如下
typedef struct /* Polygon vertex structure */ {double x; /* Vertex x component */double y; /* vertex y component */ } gpc_vertex;
再看看gpc_polygon这个比较重要的数据类型。
typedef struct /* Polygon set structure */ {int num_contours; /* Number of contours in polygon */int *hole; /* Hole / external contour flags */gpc_vertex_list *contour; /* Contour array pointer */ } gpc_polygon;
num_contours指这个多边形有几个多边形组成,hole指的是洞,就是在多边形挖洞,就像铜钱里的孔,比如铜钱可能有两个边界,一个是外部的圆,一个是方形的洞,如果只是一个闭合多边形,那么num_contours == 1,hole == 0就好了。gpc_vertex_list是每个多边形的点,定义如下:
typedef struct /* Vertex list structure */ {int num_vertices; /* Number of vertices in list */gpc_vertex *vertex; /* Vertex array pointer */ } gpc_vertex_list;
即点数和点坐标,这个就不做解释了。
运用gpc,首先你要将你的多边形数据转化成gpc_polygon这个类型,然后运用其函数就能得到结果。下面是我的代码:
double CMap3DEditorDoc::CalIntersectRegion(CSMAPFace *pSubject_Face, CSMAPFace *pClip_Face) {if(!pSubject_Face || !pClip_Face) return 0;gpc_polygon *psubject_polygon = new gpc_polygon;//第一个多边形数据gpc_polygon *pclip_polygon = new gpc_polygon;//第二个多边形数据gpc_polygon *presult_polygon = new gpc_polygon; //交集多边形数据psubject_polygon->num_contours = pclip_polygon->num_contours = presult_polygon->num_contours = 1;psubject_polygon->hole = pclip_polygon->hole = presult_polygon->hole = 0;//初始化FaceToPolygon(pSubject_Face, psubject_polygon);//转化第一个多边形数据成gpc_polygonFaceToPolygon(pClip_Face, pclip_polygon);//转化第二个数据gpc_polygon_clip(GPC_INT, psubject_polygon, pclip_polygon, presult_polygon);//运用交差并补函数,GPC_INT指进行交运算if(!presult_polygon->num_contours) return 0;double area = ploygon_area(presult_polygon->contour->num_vertices, presult_polygon->contour->vertex);psubject_polygon=pclip_polygon=presult_polygon=NULL;delete presult_polygon;delete pclip_polygon;delete presult_polygon;return area;}
CSMAPFace是自己的数据类型。整个函数很简单就能得到相交的多边形和面积。下面是gpc文件下载:http://pan.baidu.com/share/link?shareid=2182627207&uk=3020745002http://pan.baidu.com/share/link?shareid=2184046649&uk=3020745002 竟然不能添加附件.....
转载于:https://www.cnblogs.com/nightmarec/p/3346920.html
多边形之间的交差并补....相关推荐
- python交并补_Python 集合的交差并补操作及方法
1.集合的交差并补 intersection() 交集 set1 ={'卢俊义','花荣', '吴用'} set2 ={'公孙胜','秦明','卢俊义'} res = set1.intersectio ...
- 物理引擎学习04-GJK计算多边形之间的最近距离
计算多边形之间的最近距离,才是GJK算法原本的目的.只有两个多边形不相交,计算最近距离才有效.如果相交,则最近距离无效,但是可以使用EPA算法要计算碰撞深度.本文的写作目的,主要是对GJK算法的理解和 ...
- 多边形之间相交求交点的算法_路径规划算法总结
本文来自知乎网友@搬砖的旺财,地平线机器人算法工程师.作者根据自己本科和硕士阶段的学习经历,整理归纳了所接触过的规划算法. 1.自主机器人近距离操作运动规划体系 在研究自主运动规划问题之前,首先需建立 ...
- 判断点是否在两个多边形之间
inline bool in_range(float t1, float t2,float x) {return x>t1 && x<t2 || x<t1 & ...
- Python学习,Day2
### Number ( int float bool complex) #int 整型 (正整数 0 负整数) intvar = 123 #type 获取值的类型 res = type(intvar ...
- 自己用as3实现的以多边形等几何模型为基础的碰撞系统 - 例子A
这个系统支持多边形.线段.点.圆这些模型之间的碰撞检测 本例实现的基本的圆形和多边形之间的碰撞等的动画呈现. 请见例子:碰撞系统实现的例子 A 这个例子中没有考虑对于尖锐物的碰触,没有考虑碰撞带来的旋 ...
- 多边形网格到B-Rep实体转换:算法详细信息和C ++代码示例
Using a triangulation algorithm (known as tessellation) on a model's boundary representation is rela ...
- mysql st_contains实现_查看某一个点是否在某个多边形内 使用ST_Contains函数
查看某一个点是否在某个多边形内 使用ST_Contains函数 --LINESTRING ( 121.312350 30.971457 , 121.156783 31.092221 , 121.35 ...
- 机器人学(四):位姿的直线插补
一.问题 已知起始和终止位姿的齐次变换矩阵:,求两者之间的直线插补. 二.解法 这个问题的解法不唯一,这里只提出一种仅供参考. 首先将位置和姿态分离:.由以下公式求出插补位置和姿态: ...
最新文章
- 《OpenCV3编程入门》学习笔记5 Core组件进阶(二) ROI区域图像叠加图像混合
- ubuntu 安装redis
- android onLayout死循环
- cxGrid导出Excel货币符号问题
- RouterModule.forRoot() called twice
- MSFT Outlook VBA处理新邮件的方法
- hadoop中map和reduce的数量设置问题
- JFreeChart的简单应用及乱码解决
- 【Elasticsearch】es 7.8.0 唐诗三百首写入 Elasticsearch 会发生什么
- linux下设置opencv环境变量
- jdbc连接oracle_Oracle数据库性能监控|使用SiteScope 监控Oracle
- 创意c语言程序设计,大学生·创意·创新创业教育与实践系列教材:C语言程序设计教程简介,目录书摘...
- 跨交换机的VLAN 部署
- 数据库中的左连接和右连接的区别
- 性能测试基础知识-测试指标(转载自阿里云)
- Python分析中国大陆各直辖市及各省省会的平均工资与平均房价 课程报告+源码及数据
- windows 进程监控 Procmon.exe
- C语言程序设计第五版谭浩强著 第五章部分课后习题答案
- 用金碟软件二次开发ERP是否有前途?
- 用友系统服务器,用友财务系统需要什么云服务器