OpenGL畫bezier曲線
Bezier Curve算法是根據(jù)參數(shù)曲線方程來得到光滑曲線的一種算法,曲線方程的參數(shù)由控制點決定。
其本質(zhì)是由調(diào)和函數(shù)根據(jù)控制點插值而成,其參數(shù)方程如下:
其中Pi(i=0,1,…,n)為控制點的向量,
Bi,n(t)為伯恩斯坦Bernstein基函數(shù),其多項式表示為:
線性Bezier Curve由兩個控制點決定:
二次Bezier Curve由三個控制點決定:
三次Bezier Curve由四個控制點決定:
如下圖,t = AE:AB = BF:BC = CG:CD = EH:EF = FI:FG = HJ:HI,J即為Bezier曲線上的點
t取0到1的過程就把bezier曲線畫出來了。
Bezier Curve的特點:
1、端點性質(zhì):通過起點和終點;
2、對稱性:保持頂點位置不變,順序顛倒,新曲線的形狀不變,只是參數(shù)變化的方向相反;
3、凸包性:由二項式定理得知Bi,n(t)求和為1,即Bi,n(t)構(gòu)成了Bezier曲線的一組權(quán)函數(shù),因此Bezier曲線一定落在其控制多邊形的凸包之中。
4、幾何不變性:Bezier曲線的形狀只與其控制點的相對位置有關(guān),與坐標(biāo)變化無關(guān)。
實現(xiàn)三次Bezier曲線函數(shù)的代碼如下:vector用于儲存構(gòu)成曲線的點坐標(biāo),若每次都重新分配會導(dǎo)致堆溢出,因此每次都用同一內(nèi)存空間
//用于存儲畫曲線的點坐標(biāo) float* vector = new float[2000]; float* bezierCurve(float step, float* points) { //一共有幾個點 int size = 1.0 / step; float t = 0.0f; //參考公式 Q(t)=(1-t)^3*P0 + 3t(1-t)^2*P1 + 3t^2(1-t)*P2 + t^3*P3 for (int index = 0; index < size; index++, t += step) { vector[index * 3] = (1 - t)*(1 - t)*(1 - t)*points[0] + 3 * t*(1 - t)*(1 - t)*points[3] + 3 * t*t*(1 - t)*points[6] + t*t*t*points[9]; vector[index * 3 + 1] = (1 - t)*(1 - t)*(1 - t)*points[1] + 3 * t*(1 - t)*(1 - t)*points[4] + 3 * t*t*(1 - t)*points[7] + t*t*t*points[10]; vector[index * 3 + 2] = 0.0f; } return vector; }
【部分運行效果】
用鼠標(biāo)左鍵點擊四個點,根據(jù)點的順序畫出三次Bezier曲線
改變點的順序,得到新的Bezier曲線
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
《戰(zhàn)狼》中兩軍作戰(zhàn)入侵代碼竟然是輸出星期幾的!
這篇文章主要介紹了《戰(zhàn)狼》中兩軍作戰(zhàn)入侵代碼竟然是輸出星期幾的,喜歡戰(zhàn)狼和編程的同學(xué)可以了解下。2017-11-11C語言FlappyBird飛揚的小鳥實現(xiàn)開發(fā)流程
因為在家宅了好多天,隨手玩了下自己以前做的一些小游戲,說真的,有幾個游戲做的是真的劣質(zhì),譬如 flappybird 真的讓我難以忍受,于是重做了一波分享給大家2022-11-11