【问题标题】:Calculation of cubic Bézier with known halfway point计算已知中点的三次贝塞尔曲线
【发布时间】:2009-01-01 11:05:02
【问题描述】:

我知道:

  • 控制点 a 和 d(二维三次贝塞尔曲线的起点和终点)

  • 坡度 a->b、c->d 和 b->c(b、c 其他控制点)

  • Bézier curve 的中点在哪里。

现在,根据这些信息,控制点 b 和 c 的位置的公式是什么?

【问题讨论】:

  • 这听起来更像是一道数学题而不是编程题?
  • 听起来也像是无法通过 Google 找到的家庭作业
  • 很多编程问题不也是数学问题吗?这个问题对我来说听起来完全没问题,不管是否有作业——我也想知道解决方案,只是出于好奇:-)
  • 这是我的一个处理矢量图形的程序的问题。这是更大转变的一部分,但我不想用不相关的背景来填充这个问题。
  • 天啊,我们现在不是被允许进行自我导向的数学探索吗?我花了很多时间在任何课程之外摆弄计算机图形。这叫做学习,而不是作业。

标签: math bezier


【解决方案1】:

我知道这个问题很老,但没有提供正确或完整的答案,所以我想我会提出一个解决方案。请注意,David 的计算包含多个错误,即使纠正了这些错误,他的解决方案也不完整。

首先,使用三个斜率定义向量T0T1T2

T0 = ( b - a ) / u0
T1 = ( c - b ) / u1
T2 = ( d - c ) / u2

如果我们知道每对控制点之间的方向距离,那么我们就不需要比例因子u0u1u2 .因为我们只知道斜率,所以u0u1u2 是未知的标量。此外,由于定义了斜率,我们假设 u0u1u2 不为零。

我们可以用几种不同的方式重写这些方程,以获得每个控制点相对于其他控制点的表达式。例如:

b = a + T0*u0
c = b + T1*u1
d = c + T2*u2

问题还表明我们有三次贝塞尔曲线的“中点”。我认为这意味着我们的点位于曲线参数范围的中点。我将这一点称为p

p = ( a + 3*b + 3*c + d ) / 8

用左侧的未知数重写产生:

b + c = ( 8*p - a - d ) / 3

我们现在可以使用前面的表达式以各种方式替换bc。事实证明,当我们有并行向量T0T1T2 时,就会出现歧义。有四种情况需要考虑。

案例1:T0T1不平行

代入b = a + T0*u0c = a + T0*u0 + T1*u1并求解u0u1

2*T0*u0 + T1*u1 = ( 8*p - 7*a - d ) / 3

这是两个方程和两个未知数,因为 T0T1 是向量。将u0u1 替换回b = a + T0*u0c = a + T0*u0 + T1*u1 以获得缺失的控制点bc

案例2:T1T2不平行

代入c = d - T2*u2b = d - T2*u2 - T1*u1并求解u1u2

T1*u1 + 2*T2*u2 = ( a + 7*d - 8*p ) / 3

案例3:T0T2不平行

替换b = a + T0*u0c = d - T2*u2 并求解u0u2

T0*u0 - T2*u2 = ( 8*p - 4*a - 4*d ) / 3

案例4:T0T1T2都是并行的

在这种情况下,abcd 都是共线的,T0T1T2 都等价于一个比例因子内。没有足够的信息来获得唯一的解决方案。一种简单的解决方案是通过设置u0 = 1 来简单地选择b

b = a + T0
(a + T0) + c = ( 8*p - a - d ) / 3
c = ( 8*p - 4*a - d - 3*T0 ) / 3

存在无数种解决方案。本质上,选择b 定义c 或选择c 将定义b

扩展到 3D

这个问题专门询问了平面贝塞尔曲线,但我认为有趣的是,当将此问题扩展到非平面 3D 三次贝塞尔曲线时,点 p 不是必需的。在这种情况下,我们可以简单地求解u0u1u2 的方程:

T0*u0 + T1*u1 + T2*u2 = d - a

这是三个方程(向量是 3D)和三个未知数(u0u1u2)。替换成b = a + T0*u0c = b + T1*u1c = d - T2*u2 得到bc

【讨论】:

    【解决方案2】:

    假设你的斜率是标准化的,那么对于某些 u,v 你有

    u * slope(a->b)+a = b, v * slope(c->d)+d = c
    

    你知道 a、d 和 q:=(a+b+c+d)/8 的值(曲线的中点) 所以c = 8(q-a-d-b)

    将上述方程代入你得到的最后一个方程

    v * slope(c->d)+d = 8(q-a-d-a-u * slope(a->b))
    

    这是两个变量(u,v)中的2个方程(一个二维向量方程)

    你不需要第三个斜坡。

    【讨论】:

    • 我得到了类似的东西,但问题是当两个斜坡平行时它没有给出解决方案。它涉及除以 (slope(a->b)xslope(c->d)y - slope(a->b)yslope(c->d)x) ,对于平行斜坡。
    • 啊,现在我明白了,你正在处理多个解决方案,所以第三个斜率消除了歧义。警告,可能与其余 8 个数量不一致。
    猜你喜欢
    • 2016-06-24
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    • 2012-07-27
    • 1970-01-01
    相关资源
    最近更新 更多