代码之家  ›  专栏  ›  技术社区  ›  Jonathan C Dickinson

将N元B样条曲线转换为一系列二次或三次B样条曲线

  •  2
  • Jonathan C Dickinson  · 技术社区  · 17 年前

    我正在为MOSA(所有C#操作系统之间的关联体)做一些TTF工作。我和科林·伯恩目前正在努力使一些TTF代码正常工作(现在我越来越少了:)-他取得了很大的进步)。

    喘息 根本没有句柄(TTF有一个圆圈的例子来演示它-做得好的白痴-你节省了10个字节)。

    有人能给我一个如何做到这一点的指针吗?我在维基百科上看了贝塞尔的文章,但实际上没有多大帮助——他们展示了它的发生,但没有给出任何数学。一些“程序”就绪的东西会有帮助(我的微积分不是它应该是什么)——一些伪代码或其他东西。

    3 回复  |  直到 17 年前
        1
  •  3
  •   Spoike Otávio Décio    17 年前

    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;
    }
    

        2
  •  1
  •   Spoike Otávio Décio    17 年前

    我做了一些挖掘,发现了一些 algorithms 对于TTF规范,请访问 this site over here .

        3
  •  1
  •   tfinniga    17 年前

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

    您需要熟悉两种算法。

    我使用的主要参考资料是我的CAGD课堂教科书,它是在线的。Bezier提取包含在 section 6.3 section 2.4 . 如果你有任何问题,请告诉我。。