OpenGL:绘制3点之间的曲线

时间:2012-07-19 18:49:24

标签: opengl-es cocos2d-iphone bezier

基本上我希望在openGL中绘制3点之间的曲线,如下图所示。我发现了几段代码,这些代码对于使用4点绘制贝塞尔曲线非常有用,但是对于3点,我确实没有成功。

enter image description here

2 个答案:

答案 0 :(得分: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

Bezier Constructions

在您的情况下,您知道中点(p2x,p2y)。您还可以假设c1xc2x具有相同的值;并且c1yc2y也具有相同的值

所以我们在t = 0.5

时有以下等式
p2x = (3/4)*c1x+(p1x+p3x)/8
p2y = (3/4)*c1y+(p1y+p3y)/8

c1x=c2xc1y=c2y解决了

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

根据点(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 )
  5. 以下是我使用p1=(0,0)p2=(2,2)p3=(4,-1)制作的示例。我计算了以下控制点

    1. ( 0, 0 )
    2. ( 2, 17/6 )
    3. ( 2, 17/6 )
    4. ( 4, -1)
    5. 结果如下所示:

      Derive Plot

答案 1 :(得分:1)

听起来像是想要Hermite spline