以前接触二维图形的操作比较多,多边形之间的交差并补是一个难点,算法也颇为复杂,幸好有一些现成的源代码文件,比如这个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

多边形之间的交差并补....相关推荐

  1. python交并补_Python 集合的交差并补操作及方法

    1.集合的交差并补 intersection() 交集 set1 ={'卢俊义','花荣', '吴用'} set2 ={'公孙胜','秦明','卢俊义'} res = set1.intersectio ...

  2. 物理引擎学习04-GJK计算多边形之间的最近距离

    计算多边形之间的最近距离,才是GJK算法原本的目的.只有两个多边形不相交,计算最近距离才有效.如果相交,则最近距离无效,但是可以使用EPA算法要计算碰撞深度.本文的写作目的,主要是对GJK算法的理解和 ...

  3. 多边形之间相交求交点的算法_路径规划算法总结

    本文来自知乎网友@搬砖的旺财,地平线机器人算法工程师.作者根据自己本科和硕士阶段的学习经历,整理归纳了所接触过的规划算法. 1.自主机器人近距离操作运动规划体系 在研究自主运动规划问题之前,首先需建立 ...

  4. 判断点是否在两个多边形之间

    inline bool in_range(float t1, float t2,float x) {return x>t1 && x<t2 || x<t1 & ...

  5. Python学习,Day2

    ### Number ( int float bool complex) #int 整型 (正整数 0 负整数) intvar = 123 #type 获取值的类型 res = type(intvar ...

  6. 自己用as3实现的以多边形等几何模型为基础的碰撞系统 - 例子A

    这个系统支持多边形.线段.点.圆这些模型之间的碰撞检测 本例实现的基本的圆形和多边形之间的碰撞等的动画呈现. 请见例子:碰撞系统实现的例子 A 这个例子中没有考虑对于尖锐物的碰触,没有考虑碰撞带来的旋 ...

  7. 多边形网格到B-Rep实体转换:算法详细信息和C ++代码示例

    Using a triangulation algorithm (known as tessellation) on a model's boundary representation is rela ...

  8. mysql st_contains实现_查看某一个点是否在某个多边形内 使用ST_Contains函数

    查看某一个点是否在某个多边形内  使用ST_Contains函数 --LINESTRING ( 121.312350 30.971457 , 121.156783 31.092221 , 121.35 ...

  9. 机器人学(四):位姿的直线插补

    一.问题 已知起始和终止位姿的齐次变换矩阵:,求两者之间的直线插补. 二.解法         这个问题的解法不唯一,这里只提出一种仅供参考. 首先将位置和姿态分离:.由以下公式求出插补位置和姿态: ...

最新文章

  1. .NET4.0并行计算技术基础(8)
  2. BERT小学生级上手教程,从原理到上手全有图示,还能直接在线运行
  3. 我为什么不用do{}while()
  4. 利用Python实现矩阵乘法并与numpy的结果比较
  5. 用sp_addlinkedserver建立链接服务器(sql server2008中通过测试)
  6. Strange Housing CodeForces - 1471F
  7. 用Fragment制作的Tab页面产生的UI重叠问题
  8. FreeRTOS任务通知
  9. [洛谷2357] 守墓人
  10. 【rabbitmq】Queueingconsumer被废止后老代码如何做的解决方案
  11. 录屏直播时,只有部分屏幕的解决办法
  12. 快收藏!最适合计算机大学生的Java毕业设计项目--高校食堂点餐系统
  13. 常用web服务器:状态监控status页面
  14. 从还珠格格到延禧攻略,不变的是什么?
  15. python实现指数增长
  16. Windows/Linux下C++对于UUID的跨平台封装
  17. 几种常用交叉验证(cross validation)方式的比较
  18. 英雄无敌3 Heroes III 里面的英语单词 (转)
  19. 小白面试:EF Core的三种事务
  20. 文件系统/var空间100%的问题

热门文章

  1. Android 6.0: 动态权限管理的解决方案
  2. 46个海量免费电子书下载网站
  3. Day7 - Sys Module, A simple API, readupdate excel
  4. 华为计步器下载手机版_华为鸿蒙OS2.0手机版12月16日见,90%以上的华为手机都可升级...
  5. python爬取数据分析淘宝商品_python爬取并分析淘宝商品信息
  6. html带取消的谈窗框,窗框的制作方法
  7. vb6.0开发的上位机串口助手(自动识别电脑端口号、支持文本、十六进制发送)
  8. mysql latid1_mysql数据库触发器详解-阿里云开发者社区
  9. php7.3到php7.4新特性
  10. 现代项目管理学习心得