1

基本上,我希望在 openGL 中的 3 个点之间绘制一条曲线,如下图所示。我发现了几段代码,它们对于使用 4 个点绘制贝塞尔曲线很有用,但对于 3 个点,我真的没有成功。

在此处输入图像描述

4

2 回答 2

7

根据贝塞尔曲线的定义,您有以下公式(对于每个 x、y 分量):

x(t) = (1-t)^3*p1x + 3*t*(1-t)^2*c1x + 3*t^2*(1-t)*c3x + t^3*p3x
y(t) = (1-t)^3*p1y + 3*t*(1-t)^2*c1y + 3*t^2*(1-t)*c3y + t^3*p3y

贝塞尔结构

在您的情况下,您知道中间点(p2x,p2y)。您也可以假设c1xc2x具有相同的值;和 thatc1yc2y有相同的价值

所以我们有以下方程在 t=0.5

p2x = (3/4)*c1x+(p1x+p3x)/8
p2y = (3/4)*c1y+(p1y+p3y)/8

解决了c1x=c2x_c1y=c2y

c1x = c2x = -(p1x-8*p2x+p3x)/6
c1y = c2y = -(p1y-8*p2y+p3y)/6

给出最终的 Bezier 方程,以点(p1x,p1y)(p2x,p2y)的形式使用(p3x,p3y)

x(t) =    (1-t)^3 *      [p1x]
     + 3*t*(1-t)^2 * [-(p1x-8*p2x+p3x)/6]
     + 3*t^2*(1-t) * [-(p1x-8*p2x+p3x)/6]
     +    t^3 *          [p3x]

y(t) =    (1-t)^3 *      [p1y]
     + 3*t*(1-t)^2 * [-(p1y-8*p2y+p3y)/6]
     + 3*t^2*(1-t) * [-(p1y-8*p2y+p3y)/6]
     +    t^3 *          [p3y]

概括

尝试四个控制点

  1. ( p1x, p1y )
  2. ( -(p1x-8*p2x+p3x)/6, -(p1y-8*p2y+p3y)/6 )
  3. ( -(p1x-8*p2x+p3x)/6, -(p1y-8*p2y+p3y)/6 )
  4. ( p3x, p3y )

这是我用p1=(0,0),p2=(2,2)和制作的一个例子p3=(4,-1)。我计算了以下控制点

  1. ( 0, 0 )
  2. ( 2, 17/6 )
  3. ( 2, 17/6 )
  4. ( 4, -1)

结果如下所示:

导出图

于 2012-07-19T20:18:58.290 回答
1

听起来你想要一个Hermite spline

于 2012-07-19T19:17:24.310 回答