绘图的一部分贝塞尔的曲线,通过重新使用的一个基本的贝塞尔-曲线的功能吗?

StackOverflow https://stackoverflow.com/questions/878862

假如我使用一些图形接口,可以让我的画 贝塞尔的曲线,通过指定4的必要点:开始、结束、两个控制点.

我可以 重用这种功能x% 的'原'曲线 (通过调节的控制点和结束点)?

或者是不可能的?

不必要的信息,应该有人照顾:

  • 我需要整个事情绘制每n%的原始
    曲线 用不同的颜色和/或行的风格
  • 我用爪哇的Path2D画曲曲线:

    Path2D p = new GeneralPath();
    p.moveTo(x1, y1);
    p.curveTo(bx1, by1, bx2, by2, x2, y2);
    g2.draw(p);
    
有帮助吗?

解决方案

什么你需要的是 De可算法.这会让你分割你的曲线成任何一段你会喜欢的。

然而,由于你要处理只是立方米曲线,我想建议一个稍微更易于使用的制剂,这会给你一段 t0t1 哪里 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).

注意, t0t1 是不完全的百分比曲线 距离 而是曲线 参数的空间.如果你绝对必须的距离,然后东西都更加困难。试试这个,看看如果你需要什么。

编辑: 值得注意的是,这些公式简化了相当如果 t0t1 是0或1(即你只是想修剪从一个侧)。

此外,关系 0 <= t0 <= t1 <= 1 不是严格的要求。例如 t0 = 1t1 = 0 可以使用"触"曲线向后倒退,或 t0 = 0t1 = 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 其终点。 P2P3 是的控制点。

鉴于两个参数 t0t1 (并与 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

请注意,在括号中的表达,至少某些条款都是平等的,可以结合起来。我没有这样做的公式作为指出这将使该模式更清楚,我相信。你可以简单地执行这些计算独立的 xy 方向计算新的控制点。

注意,一定百分比的参数范围 t 在一般将不符合同样的百分比的长度。所以你很可能已经整合过的曲线转的道路长度回到参数。或者你使用一些近似值。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top