c - 将由轮廓样条构建的形状转换为简单的多边形

标签 c opengl vector-graphics polygons splines

我已经从 truetype 文件中转储了字形,所以我可以使用它们。它们具有由二次贝塞尔曲线和直线组成的形状轮廓。我想输出此类形状的三角形,以便为用户可视化它们。

传统上我可能会使用 libfreetype 或扫描栅格化这种轮廓。但我想从字体中生成挤压的 3D 网格,并用它们进行其他扭曲。

那么,如何将由二次贝塞尔曲线和直线组成的形状多边形化?有许多轮廓一起形成形状。有些轮廓是加法的,有些是减法的。轮廓永远不会打开。它们形成一个循环。

(实际上,我只从 ttf 字形中获取轮廓顶点,这些顶点定义了它们是否是曲线的一部分。尽管很容易将它们分解为贝塞尔曲线和直线,但知道数据以这种方式表示可能有助于将轮廓多边形化为三角形)

最佳答案

这很简单。您需要对曲线执行 bool 运算,然后继续连接成对的曲线,直到只剩下一条曲线。

首先,您需要评估曲线并将它们转换为折线。

然后你需要确保在两个轮廓相交的每个地方都有一个顶点(这部分实际上可以尝试,由于数字错误;你可以使用 the Bentley-Ottmann algorithm )。

最后,您需要做的就是遍历曲线并以正确的顺序连接它们以执行 bool 运算,产生weakly simple polygons。 .

这样的多边形可以使用例如三角剖分ear clipping algorithm (这很慢,但实现起来相当简单)。

希望这有助于...

关于c - 将由轮廓样条构建的形状转换为简单的多边形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2781711/

相关文章:

java - 矩阵在 openGL 中不起作用

OpenGL-OpenCL 互操作传输时间 + 位图纹理

algorithm - 识别 svg 文档中的修改路径

iphone - 在 iPhone 游戏中使用矢量图形

c - 来自 C++ Reference 的 fread 示例

c - fgetpos() 和 fsetpos() 是否仅适用于文本模式?如果不是字节数,fpos_t 对象填充了哪些位置/偏移数据?

c - 如何在c中从3个用户输入字符串中生成一个字符串

c - 为什么控制台上没有关于信号处理的输出?

pdf - 将 pdf 转换为矢量图像

c++ - 在循环中显示 glutDisplayFunc 函数