如何确定一个闭合路径(contour)定义的是内区还是外区?
对于一个闭合路径的每个边,如果一定存在另一个点与之构成顺时针三角形,那么是内区。
如果一个闭合路径中存在这样一个边,没有任何点与之构成顺时针三角形,那么是外区。
如何把一个闭合路径(内区)三角化?
任选相邻的三个点A、B、C,它们构成两个相邻的边,并且构成三角形,中点是B;搜索这样的三角形ABC,使得ABC成顺时针方向,并且ABC不包含其它点,保存此三点,删除中点B,重复以上过程,直到路径中仅剩三个点。
解释:一个内区闭合路径必然存在两个相邻的边构成顺时针三角形,否则它不可能定义内区;删除中点后,余下的点依然构成闭合路径,所以前句话还为真。
如何绘制Glyph?
void initializeGL()
{
glEnable(GL_STENCIL_TEST);
glDisable(GL_DEPTH_TEST);
glDisable(GL_CULL_FACE);
glClearStencil(0);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
}
void paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
//outer contours
glStencilMask(GL_TRUE);
glStencilFunc(GL_ALWAYS, 1, 0xf);
glStencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE);
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
glDrawArrays(mode, first, count);
//inner contours
glStencilFunc(GL_GREATER, 1, 0xf);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glDrawArrays(mode, first, count);
}