【问题标题】:Turn a N-Ary B-Spline into a sequence of Quadratic or Cubic B-Splines将 N 元 B 样条转换为二次或三次 B 样条序列
【发布时间】:2008-12-10 06:00:44
【问题描述】:

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

在任何情况下,TTF 规范都允许在“手柄”和 gasp 之间有任意数量的控制点,根本没有手柄(TTF 有一个圆圈的例子来证明它 - 干得好白痴——你节省了 10 个字节)。

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

谢谢大家。

【问题讨论】:

  • 您的实际问题是什么? :P 你想完成什么?
  • “干得好白痴”?请编辑避免不明智的讽刺。

标签: c# algorithm math spline


【解决方案1】:

来自维基百科中的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 投票。
  • @Jonathan C Dickinson:我还没有阅读 True Type Font 规范(我猜 TTF 代表那个),但我想它应该列出一些公式来将点转为更高阶。只需以类似的方式将其转换为代码即可。
【解决方案2】:

我进行了一些挖掘,并在 this site over here 上找到了一些用于 TTF 规范的 algorithms

【讨论】:

    【解决方案3】:

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

    您需要熟悉两种算法。

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

    我使用的主要参考资料是我的在线 CAGD 课本。 section 6.3 中介绍了贝塞尔提取。贝塞尔曲线的度数在section 2.4 中介绍。如果您有任何问题,请告诉我..

    【讨论】:

    • 基本上,字形定义为一系列点。这些点可以位于(处理)或关闭(控制)曲线。在开启点之间可以有多少关闭点是没有限制的。你甚至不需要积分。我需要二次方的字形,或者如果必须的话,三次贝塞尔曲线。
    • 我再也找不到文档了,我已经很久没有真正从事这个项目了。
    • 对不起,“我需要二次方的字形,或者如果必须的话,三次方贝塞尔曲线。”应该是“我需要很多二次曲线中的字形,或者如果必须的话,很多三次贝塞尔曲线。”
    猜你喜欢
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    • 2017-06-20
    • 1970-01-01
    • 2010-10-27
    相关资源
    最近更新 更多