第五十三章 比例切割 算法初成(2 / 2)
陈东风也是发了狠,不设计出这个算法,连门都懒的出了,过年前的卫生也忘记打扫了。好在李爷爷看他钻研辛亏,毫不计较,尽心尽力的为他做好了后勤工作。
终于,陈东风在大年三十前把这套他自己命名的比例切割算法给设计出来了。灵感来自于华国历史上著名的数学家祖冲之的割圆术,割圆术目的是等分圆之后取得正多边形,而他的比例切割是取一个特定的比例来逼近一个特殊的曲线。
简单来讲比例切割算法(以一次贝塞尔曲线为例的基本观点是选择在ab中的一个点c,c将ab分为u:1-u(a到c的距离与ab之间的距离之比是u),让我们找到决定c在哪里的方法。
从a到b的向量是b-a。因为u是在和1之间的比率,点c位于u(b-a)。将a的位置加以考虑,点c为a+u(b-a)=(1-u)a+ub。因此,对于给定的u,(1-u)a+ub是在a和b之间的点c,将ab分为u:1-u的两段。
更加具有普遍性的比例切割算法的想法如下是假设我们想要找到c(u),u在[,1]中。由第一个多段线p-p1-p2-p3-pn开始,利用上面的法则找到在线段上的点p1i,p1i在pi到p(i+1)的连线上并且将这段线分为u:1-u的两部分。依次地,我们可以得到n个点1,11,12,,1(n-1),他们定义了一个新的多段线,一共有n-1段。
新点由1i进行标记,再次利用上面的规则我们可以得到第二个多段线,具有n-1个点(2,21,,2(n-2)和n-2条边。从这个多段线开始,进行第三次,得到新的多段线,由n-2个点3,31,,3(n-3)和n-3条边组成。重复这个过程n次得到一个点n。
以上想法只是给定了比例切割想法的几何解释,而实际计算需要一个具体的计算方法。
首先,对于每一对临近的控制点,可以画出一条右上方和右下方的箭头(类似于杨辉三角,并且在两个箭头的交点处写下一个新点。例如相邻的两个点分别为ij和i(j+1),新点是(i+1)j,右下方(相对应的左下方的箭头表示将其尾数ij(相对应的为i(j+1)乘以1-u(相对应的乘以u,新的点是两个的和。
因此,从初始的第列开始,我们计算第1列。之后从第1列得到第2列。最终,在n次计算之后我们最终到达了一个单个的点n并且这个点就是在曲线上的点。下面的算法总结了上面我们讨论的内容,输入的是具有n+1个点的数列p和在到1之间的u,最终得到在贝塞尔曲线上的点c(u)。
这个计算过程可以用递归的方法表示,对于j=,1,,n用p,j表示pj,也就是p,j是第列的第j项元素,在第i列计算第j项如下:p(i,j)=(1-u)p(i-1,j)+up(i-1,j+1),(i=1,2,n;j=,1,2,n-i)
元素pi,j是(1-u)pi-1,j(左上方元素和upi-1,j+1(左下方元素的和,最终的结果(在曲线上的点是pn,在这种想法的基础上,通过编程就可以得到基本的算法程序。
在这个基本算法的基础上,陈东风还需要对螺旋线、球面螺旋线、双弧外摆线和星行线、心脏线、圆内螺旋线、正弦曲线、太阳线和费马曲线等等几百种曲线给出需要选定的控制点数量和控制比例u。这个工作如果没有计算机的帮助的话,估计他这辈子都得耗在这上面了。
“好在,通用的算法已经计算出来了,可能有迭代算法效率的不高的问题,但是计算机应该可以克服。”陈东风一边自言自语,一边站了起来,往窗外一看天快黑了,正好肚子有点饿,把桌子上堆成小山的草稿纸整理下后,就出了房间。