绘图的一部分贝塞尔的曲线,通过重新使用的一个基本的贝塞尔-曲线的功能吗?
-
22-08-2019 - |
题
假如我使用一些图形接口,可以让我的画 贝塞尔的曲线,通过指定4的必要点:开始、结束、两个控制点.
我可以 重用这种功能 画 x% 的'原'曲线 (通过调节的控制点和结束点)?
或者是不可能的?
不必要的信息,应该有人照顾:
- 我需要整个事情绘制每n%的原始
曲线 用不同的颜色和/或行的风格 我用爪哇的Path2D画曲曲线:
Path2D p = new GeneralPath(); p.moveTo(x1, y1); p.curveTo(bx1, by1, bx2, by2, x2, y2); g2.draw(p);
解决方案
什么你需要的是 De可算法.这会让你分割你的曲线成任何一段你会喜欢的。
然而,由于你要处理只是立方米曲线,我想建议一个稍微更易于使用的制剂,这会给你一段 t0
要 t1
哪里 0 <= t0 <= t1 <= 1
.这里的一些伪:
u0 = 1.0 - t0
u1 = 1.0 - t1
qxa = x1*u0*u0 + bx1*2*t0*u0 + bx2*t0*t0
qxb = x1*u1*u1 + bx1*2*t1*u1 + bx2*t1*t1
qxc = bx1*u0*u0 + bx2*2*t0*u0 + x2*t0*t0
qxd = bx1*u1*u1 + bx2*2*t1*u1 + x2*t1*t1
qya = y1*u0*u0 + by1*2*t0*u0 + by2*t0*t0
qyb = y1*u1*u1 + by1*2*t1*u1 + by2*t1*t1
qyc = by1*u0*u0 + by2*2*t0*u0 + y2*t0*t0
qyd = by1*u1*u1 + by2*2*t1*u1 + y2*t1*t1
xa = qxa*u0 + qxc*t0
xb = qxa*u1 + qxc*t1
xc = qxb*u0 + qxd*t0
xd = qxb*u1 + qxd*t1
ya = qya*u0 + qyc*t0
yb = qya*u1 + qyc*t1
yc = qyb*u0 + qyd*t0
yd = qyb*u1 + qyd*t1
然后就画在贝塞尔的曲线形成的 (xa,ya)
, (xb,yb)
, (xc,yc)
和 (xd,yd)
.
注意, t0
和 t1
是不完全的百分比曲线 距离 而是曲线 参数的空间.如果你绝对必须的距离,然后东西都更加困难。试试这个,看看如果你需要什么。
编辑: 值得注意的是,这些公式简化了相当如果 t0
或 t1
是0或1(即你只是想修剪从一个侧)。
此外,关系 0 <= t0 <= t1 <= 1
不是严格的要求。例如 t0 = 1
和 t1 = 0
可以使用"触"曲线向后倒退,或 t0 = 0
和 t1 = 1.5
可能是用来延长曲线过去的原始结束。然而,该曲线中看起来可能不同于预期,如果你试图扩大它过去的 [0,1]
范围。
Edit2: 超过3年后我原来的答案,MvG指出一个错误我的方程式。我忘了最后一个步骤(一个额外的线性插值得到最终控制点)。方程上已得到修正。
其他提示
在 一个答案 要 另一个问题 我只是包括了一些公式来计算控制点的一部分的一个立方体的曲线。与 u = 1 − t, ,a cubic bezier curve被描述为
B(t) = u3 P1 + 3u2t P2 + 3ut2 P3 + t3 P4
P1 是的开始点的曲线, P4 其终点。 P2 和 P3 是的控制点。
鉴于两个参数 t0 和 t1 (并与 u0 = (1 − t0), u1 = (1 − t1)),该部的曲线中的间隔时间[t0, t1]描述的是通过新的控制点
- Q1 = u0u0u0 P1 + (t0u0u0 + u0t0u0 + u0u0t0) P2 + (t0t0u0 + u0t0t0 + t0u0t0) P3 + t0t0t0 P4
- Q2 = u0u0u1 P1 + (t0u0u1 + u0t0u1 + u0u0t1) P2 + (t0t0u1 + u0t0t1 + t0u0t1) P3 + t0t0t1 P4
- Q3 = u0u1u1 P1 + (t0u1u1 + u0t1u1 + u0u1t1) P2 + (t0t1u1 + u0t1t1 + t0u1t1) P3 + t0t1t1 P4
- Q4 = u1u1u1 P1 + (t1u1u1 + u1t1u1 + u1u1t1) P2 + (t1t1u1 + u1t1t1 + t1u1t1) P3 + t1t1t1 P4
请注意,在括号中的表达,至少某些条款都是平等的,可以结合起来。我没有这样做的公式作为指出这将使该模式更清楚,我相信。你可以简单地执行这些计算独立的 x 和 y 方向计算新的控制点。
注意,一定百分比的参数范围 t 在一般将不符合同样的百分比的长度。所以你很可能已经整合过的曲线转的道路长度回到参数。或者你使用一些近似值。