我有一条近似曲线的折线,我想在 PostScript 中将其绘制为平滑曲线,它支持贝塞尔曲线绘制。为此,我需要在每对折线点之间生成两个控制点。(我不能从源头得到原始曲线,只能得到折线。)
我使用这个描述中的基数样条取得了一些成功,但是那里的参数与Wikipedia和GDIPlus.DrawCurve不同,两者都涉及张力。MS 没有细节,维基百科有不完整的细节(基数样条忽略 x 值?)。
基于张力的控制点的公式是什么?
请参阅此链接http://www.ibiblio.org/e-notes/Splines/Cardinal.htm,它提供了简单的公式,可用于计算多段平滑曲线的贝塞尔控制点。
这些方程式非常简单,但对于那些不想重复计算的人,我提供了我的结果:
设 Pi (i=1..n) 为折线点。
首先,学习如何计算 Pi 上的导数:
P1' = (P2 - P1) / a
Pi' = (Pi+1 - Pi-1) / a (for i=2..n-1)
Pn' = (Pn - Pn-1) / a
其中“a”是一个系数(这可能意味着您提到的“张力”),例如 a=2。
然后,对于从 Pi 到 Pi+1 的每个段 i (i=1..n-1),贝塞尔控制点 B1i 和 B2i 将是:
B1i = Pi + Pi'/3
B2i = Pi+1 - Pi+1'/3
您可以通过两步过程来做到这一点:首先做一个三次 b 样条,然后从中得到三次贝塞尔曲线。
拟合贝塞尔曲线的诀窍是匹配分段端点处的导数,这基本上就是样条曲线所做的。如果你能得到样条曲线的表示,它应该有端点的点和每个段的控制点。否则,您可以确定每个线段终点的斜率,控制点将是外插线的交点。