如果我使用嵌套for循环进行迭代,如何在De Casteljau算法中指定特定的控制点?

时间:2017-02-23 15:33:11

标签: c++ algorithm opengl bezier de-casteljau

我知道使用De Casteljau的算法并不是绘制贝塞尔曲线的最佳方法,但我需要为分配实现它我根据以下等式(来自Drexel)定义算法。

其中:

定义控制点。

我正在尝试定义执行算法的函数,但我正在努力在哪里/如何合并控制点。控制点由用户定义;当他们与程序交互时,左键单击会添加一个新的控制点。我的功能目前看起来如下:

2Dpoint deCast(float t)
{
    2Dpoint tempDC   // Temporary value of point passed back to OpenGL draw function
    tempDC.x = 0; tempDC.y = 0    // Initialize temporary value

    int r,i;
    int n = C->B.size();   // C is pointer to B vector, which is where the control points are stored in a 2D vector

    for (r = 1; r<n, r++)
    {
        for (i = 0; i<n-r; i++)
        {
        // Calculation of deCast points goes here
        } 
    }
}

其中2Dpoint只是由头文件定义的结构,C是指向控制点位置的指针,控制点存储在名为{{1}的2Dpoint结构中(即Bi访问控制点向量的C -> B[i].x值。在我的C -> B[i].y函数中实现该函数时,会向函数提供t,如下所示。

draw

1 个答案:

答案 0 :(得分:0)

你也必须通过deCasteljau功能你的观点,因为这就是de Casteljau算法有效的原因(你甚至可以在你的数学公式中看到它:它读取&#34;下一个点=两个先前点的加权和&#34;)。由于您需要在点之间进行线性插值,因此需要使用points =)

在伪代码中:

deCastestljau (t, points):
  // the following code is destructive, so remember to be sensible
  points = shallowCopy(points);
  // de Casteljau's algorithm in four lines:
  while points.length > 1:
    for i=0 to points.length-2: 
      points[i] = (1-t) * points[i] + (t) * points[i+1]
    points.pop()
  // and we're done.
  return points[0]

结束:你从你的控制点开始,然后你做一个线性插值传递,所以你得到连续坐标之间的所有点&#34;&#34;在距离比t(例如,如果t为0.25,那么您将在从某个点到下一个点的距离的1/4处找到每个线性插值)。

该操作产生一组比以前少1的新点。然后你又一次又一次地做,直到你有一个点离开。那是你的曲线点。这适用于任何阶贝塞尔曲线。

它与&#34;绘图&#34;几乎无关。尽管如此,de Casteljau算法是一种有效计算曲线上单个点的方法,它没有对绘制整个曲线提出任何声明,也没有任何真实的关系。这是一项完全不同的任务,de Casteljau的算法只是众多选项中的一种,可以找到你需要的绘制算法。