使用GPC分解多边形
(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 转载请标明来源)