我知道使用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
结构中(即B
和i
访问控制点向量的C -> B[i].x
值。在我的C -> B[i].y
函数中实现该函数时,会向函数提供t
,如下所示。
draw
答案 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的算法只是众多选项中的一种,可以找到你需要的绘制算法。