2

我正在为 MOSA(所有 C# 操作系统之间的关联体)做一些 TTF 工作。我和 Colin Burn 目前正在努力让一些 TTF 代码正常工作(这些天我少了 :) - 他取得了很大进展)。

在任何情况下,TTF 规范都允许在“句柄”和喘息NO 句柄之间存在任意数量的控制点(TTF 有一个圆圈示例来演示它——干得好白痴——你节省了 10 个字节)。

谁能给我一个关于如何做到这一点的指针?我查看了 Wikipedia 上的 Bezier 文章,但并没有那么大的帮助 - 他们显示它正在发生,但没有给出任何数学。准备好“程序”的东西会有所帮助(我的微积分不是应该的) - 一些伪代码或其他东西。

多谢你们。

4

3 回答 3

3

从维基百科的Bezier 文章中,通过一些实用的微积分知识,您可以将公式转换为计算机程序,如下面的伪 C# 代码清单。我用二次样条做,但很容易翻译成另一个。

// Quadratic spline, with three given points
// B(t) = (1-t)^2P(0) + 2*tP(1) + t^2P(2)
// where T is a real number in the interval [0, 1]

public void DrawQuadSpline(Point p0, Point p1, Point p2, int steps) 
{
    Point next = p0;
    Point previous = p0;
    double tStep = 1 / ((float) steps);
    double t = 0;
    for (int i = 0; i < steps; i++) 
    {
        float x = CalculateQuadSpline(P0.x, P1.x, P2.x, t);
        float y = CalculateQuadSpline(P0.y, P1.y, P2.y, t);
        Point next = new Point(x, y);
        drawLine(previous, next);
        previous = next;
        t = t + tStep;
    }
} 

private void CalculateQuadSpline(float z0, float z1, float z2, float t) 
{
    return (1.0-t)*(1.0-t)*z0 + 2.0*t*z1 + t*t*z2;
}

它可能需要一些调整,因为我以前只在 Java 中做过,但基本上就是这样。

于 2008-12-10T06:29:45.253 回答
1

我做了一些挖掘,并在这个网站上找到了一些TTF 规范的算法

于 2008-12-10T07:25:48.417 回答
1

好的,看起来 TTF 轮廓被定义为二次 b 样条。

您需要熟悉两种算法。

第一个是通过节点插入提取贝塞尔曲线。这将为您提供二次贝塞尔线段。然后,您需要对每个 Bezier 段进行度数提升以获得三次方。

我使用的主要参考资料是我的在线 CAGD 课本。贝塞尔提取在第 6.3 节中介绍。贝塞尔曲线的度数在2.4 节中介绍。让我知道如果你有任何问题..

于 2008-12-10T20:47:15.957 回答