以前接触二维图形的操作比较多,多边形之间的交差并补是一个难点,算法也颇为复杂,幸好有一些现成的源代码文件,比如这个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. 《OpenCV3编程入门》学习笔记5 Core组件进阶(二) ROI区域图像叠加图像混合
  2. ubuntu 安装redis
  3. android onLayout死循环
  4. cxGrid导出Excel货币符号问题
  5. RouterModule.forRoot() called twice
  6. MSFT Outlook VBA处理新邮件的方法
  7. hadoop中map和reduce的数量设置问题
  8. JFreeChart的简单应用及乱码解决
  9. 【Elasticsearch】es 7.8.0 唐诗三百首写入 Elasticsearch 会发生什么
  10. linux下设置opencv环境变量
  11. jdbc连接oracle_Oracle数据库性能监控|使用SiteScope 监控Oracle
  12. 创意c语言程序设计,大学生·创意·创新创业教育与实践系列教材:C语言程序设计教程简介,目录书摘...
  13. 跨交换机的VLAN 部署
  14. 数据库中的左连接和右连接的区别
  15. 性能测试基础知识-测试指标(转载自阿里云)
  16. Python分析中国大陆各直辖市及各省省会的平均工资与平均房价 课程报告+源码及数据
  17. windows 进程监控 Procmon.exe
  18. C语言程序设计第五版谭浩强著 第五章部分课后习题答案
  19. 用金碟软件二次开发ERP是否有前途?
  20. 用友系统服务器,用友财务系统需要什么云服务器

热门文章

  1. stm32舵机控制程序_免费开源基于STM32的lt;智能垃圾桶gt;之语音播报
  2. Gitlab修改管理员账户root密码
  3. Pdftoword:最精准的pdf to word文件转换器
  4. 学生会竞选PPT模板
  5. 作为一名后台开发人员,你必须知道的两种过滤器
  6. 你还不懂线程池的设计及原理吗?掰开揉碎了教你设计线程池
  7. html中row位置居中,如何快速找到html和row text对应的位置?
  8. PHP 7.4 新特性
  9. 现在后端开发都在用什么数据库存储数据?
  10. 自己总结的小米2S线刷开发版