(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源)
GPC: Generic Polygon Clipper
GPC支持分解多边形、多边形求差集、交集,异或、并集
GPC_DIFF, /* Difference */
GPC_INT, /* Intersection */
GPC_XOR, /* Exclusive or */
GPC_UNION /* Union */
使用起来是比较高效的,但因为使用c写的,语法结构和我们通常C++的略有不同,直接看接口实现的话会不适应。
因为其并未提供使用样例,所以在此写了一个简单分解多边形样例,有兴趣的可以参考一下
inline gpc_vertex BuildVertex(double x, double y) { gpc_vertex vertex; vertex.x = x; vertex.y = y; return vertex; } void TestGPC() { // 设定一个形状,使用GPC拆分成三角形 gpc_vertex_list vertextList; vertextList.num_vertices = 5; std::vector<gpc_vertex> vecVertex; vecVertex.push_back(BuildVertex(10.0, 10.0)); vecVertex.push_back(BuildVertex(-10.0, 10.0)); vecVertex.push_back(BuildVertex(-10.0, -10.0)); vecVertex.push_back(BuildVertex(10.0, -10.0)); vecVertex.push_back(BuildVertex(20, 0)); vertextList.vertex = &(vecVertex[0]); gpc_polygon myPolygon; myPolygon.num_contours= 1; myPolygon.hole= NULL; myPolygon.contour= &vertextList; // 获取分解后的三角形或四边形 gpc_tristrip tristrip; tristrip.num_strips = 0; tristrip.strip = NULL; gpc_polygon_to_tristrip(&myPolygon, &tristrip); // 存储分解后的三角形或四边形: 分解后的三角形是连续接壤的 <0,1,2><1,2,3><3,4,5>... std::vector< std::vector<gpc_vertex> > vecTrisArray; std::vector<gpc_vertex> vecTris; for (int i=0; i<tristrip.num_strips; i++) { for (int j=0; j<tristrip.strip[i].num_vertices; j++) { vecTris.push_back(tristrip.strip[i].vertex[j]); } vecTrisArray.push_back(vecTris); } // 释放内存 gpc_free_tristrip(&tristrip); }
gpc下载地址:http://www.cs.man.ac.uk/~toby/alan/software/
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源)
使用GPC分解多边形样例(Generic Polygon Clipper)
原文:http://blog.csdn.net/chunyexiyu/article/details/45227595