将N-Ary B样条转换为一系列二次或三次B样条

时间:2008-12-10 06:00:45

标签: c# algorithm math spline

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

在任何情况下,TTF规范允许在“手柄”和喘气 NO手柄之间有任意数量的控制点(TTF有一个圆圈示例表明它 - 做得好白痴 - 你节省了10个字节)。

任何人都可以给我一个关于如何做到这一点的指针吗?我查看了维基百科上的Bezier文章,但它并没有那么多帮助 - 它们表明它正在发生,但是没有给出任何数学。准备好'程序'会有所帮助(我的微积分不是它应该是什么) - 一些伪代码或其他东西。

谢谢你们。

3 个答案:

答案 0 :(得分:3)

来自维基百科中的Bezier article,通过一些实用的微积分知识,您可以将公式转换为计算机程序,如下面的伪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中做过这个,但基本上就是这样。

答案 1 :(得分:1)

我做了一些挖掘,并在algorithms找到了一些this site over here的TTF规范。

答案 2 :(得分:1)

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

您需要熟悉两种算法。

首先是通过结插入进行贝塞尔提取。这将为您提供二次贝塞尔曲线段。然后你会想要提升每个贝塞尔曲线段以获得立方体。

我使用的主要参考是我的CAGD类课本,它是在线的。 Bezier提取包含在section 6.3中。贝塞尔曲线的度数提升包含在section 2.4中。如果您有任何问题,请告诉我。