如何计算具有给定隐函数的贝塞尔曲线的控制点?

时间:2016-05-09 14:19:38

标签: math bezier curves

我正在尝试编写一个程序来绘制一个贝塞尔曲线段来实现我的教科书中的知识。我想尝试使用隐式函数绘制绘图程序。我希望我的程序能够如下工作。

  • 用户输入隐式函数,假设y = 2x ^ 3。
  • 计算控制点(不知道该怎么办)
  • 绘制贝塞尔曲线(完成)
  • 下一个功能

理论上,我可以通过直接替换绘制曲线,但我可能会对曲线做一些修改,我想实现我所学到的东西,所以,我想明智地做(直接替换似乎是愚蠢的).Thz ^ ^

编辑1:我们假设边界是由用户提供的

1 个答案:

答案 0 :(得分:1)

第一步是为曲线生成参数化表达式。给出的示例可以很容易地转换:

c(t) = (t, 2 * t^3)^T

现在在Monomial basis

中表达此曲线
c(t) = / 0  1  0  0 \ * (1, t, t^2, t^3)^T
       \ 0  0  0  2 /
     = C * M(t)

在该表达式中,第一个矩阵C是系数矩阵。我们需要做的就是将这个矩阵转换为伯恩斯坦基。将单项式基础转换为伯恩斯坦基础的矩阵是:

       / 1 - 3t + 3t^2 -  t^3 \   / 1 -3  3 -1 \    /  1  \
B(t) = |     3t - 6t^2 + 3t^3 | = | 0  3 -6  3 | *  |  t  |
       |          3t^2 - 3t^3 |   | 0  0  3 -3 |    | t^2 |
       \                  t^3 /   \ 0  0  0  1 /    \ t^3 /

这个等式可以反转得到:

       / 1   1   1   1 \
M(t) = | 0  1/3 2/3  1 | * B(t)
       | 0   0  1/3  1 |
       \ 0   0   0   1 /

将其代入曲线方程,我们得到:

c(t) = C * M(t)
           / 1   1   1   1 \
     = C * | 0  1/3 2/3  1 | * B(t)
           | 0   0  1/3  1 |
           \ 0   0   0   1 /

可以计算出第一个矩阵乘积:

c(t) = / 0  1/3  2/3  1 \ * B(t)
       \ 0   0    0   2 / 

这为您提供了贝塞尔曲线的控制点:

p0 = (0, 0)^T
p1 = (1/3, 0)^T
p2 = (2/3, 0)^T
p3 = (1, 2)^T

这个程序可以应用于任何多项式曲线。

表格式的一般解决方案

y = a + b * x + c * x^2 + d * x^3

是:

p0 = (0, a)^T
p1 = (1/3, a + b/3)^T
p2 = (2/3, a + 2b/3 + c/3)^T
p3 = (1, a + b + c + d)^T