使用OpenGL的tesselator:
#include <gl/gl.h>
#include <gl/glu.h>
#include <vector>
using namespace std;
typedef vector< vector< GLdouble* > > contours;
contours poly;
//Initialize poly here
GLUtesselator* tess = gluNewTess();
gluTessCallback(tess, GLU_TESS_BEGIN, (void (CALLBACK*)())&BeginCallback);
gluTessCallback(tess, GLU_TESS_VERTEX, (void (CALLBACK*)())&VertexCallback);
gluTessCallback(tess, GLU_TESS_END, (void (CALLBACK*)())&EndCallback);
gluTessCallback(tess, GLU_TESS_COMBINE, (void (CALLBACK*)())&CombineCallback);
gluTessCallback(tess, GLU_TESS_ERROR, (void (CALLBACK*)())&ErrorCallback);
gluTessNormal(tess, 0.0, 0.0, 1.0);
gluTessProperty(tess, GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_NONZERO);
gluTessProperty(tess, GLU_TESS_BOUNDARY_ONLY, GL_FALSE); //GL_FALSE
gluTessBeginPolygon(tess, NULL);
for (UINT i = 0; i < poly.size(); ++i)
{
gluTessBeginContour(tess);
for (UINT j = 0; j < poly[i].size(); ++j)
{
gluTessVertex(tess, poly[i][j], poly[i][j]);
}
gluTessEndContour(tess);
}
gluTessEndPolygon(tess);
gluDeleteTess(tess); // Delete after tessellation
是用户将要在如何绘制多边形的限制?我的意思是他们会被阻止创建一条与现有相交的新线? – Robinson 2012-04-01 14:58:13
实际上线条可以互相交叉......无论如何,它们将被分组为单独的三角形。所以我认为即使它们相交也是可行的。 – 2012-04-01 15:06:22
解决方案3工作得很好,除了无限循环问题:/。我有点为无限循环做了一个“假”修复,它忽略了引起无限循环的顶点。 – 2012-04-01 15:19:49