我正在为MOSA(所有C#操作系统之间的相关主体)做一些TTF工作。我和Colin Burn目前正在努力让一些TTF代码正常工作(这些日子里少了我:) - 他取得了很大的进步。)
在任何情况下,TTF规范允许在“手柄”和喘气 NO手柄之间有任意数量的控制点(TTF有一个圆圈示例表明它 - 做得好白痴 - 你节省了10个字节)。
任何人都可以给我一个关于如何做到这一点的指针吗?我查看了维基百科上的Bezier文章,但它并没有那么多帮助 - 它们表明它正在发生,但是没有给出任何数学。准备好'程序'会有所帮助(我的微积分不是它应该是什么) - 一些伪代码或其他东西。
谢谢你们。
答案 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中。如果您有任何问题,请告诉我。