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),與坐標變化無關(guān)。
實現(xiàn)三次Bezier曲線函數(shù)的代碼如下:vector用于儲存構(gòu)成曲線的點坐標,若每次都重新分配會導(dǎo)致堆溢出,因此每次都用同一內(nèi)存空間
//用于存儲畫曲線的點坐標
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;
}
【部分運行效果】
用鼠標左鍵點擊四個點,根據(jù)點的順序畫出三次Bezier曲線

改變點的順序,得到新的Bezier曲線

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語言詳解熱門考點結(jié)構(gòu)體內(nèi)存對齊
C?數(shù)組允許定義可存儲相同類型數(shù)據(jù)項的變量,結(jié)構(gòu)是?C?編程中另一種用戶自定義的可用的數(shù)據(jù)類型,它允許你存儲不同類型的數(shù)據(jù)項,本篇讓我們來了解C?的結(jié)構(gòu)體內(nèi)存對齊2022-04-04
c語言中exit和return的區(qū)別點總結(jié)
小編今天給大家整理了關(guān)于c語言中exit和return的不同點及相關(guān)基礎(chǔ)知識點,有興趣的朋友們可以跟著學(xué)習(xí)下。2021-10-10
嵌入式C程序優(yōu)質(zhì)編寫全面教程規(guī)范
這是一年前我為公司內(nèi)部寫的一個文檔,旨在向年輕的嵌入式軟件工程師們介紹如何在裸機環(huán)境下編寫優(yōu)質(zhì)嵌入式C程序。感覺是有一定的參考價值,所以拿出來分享,拋磚引玉2022-04-04
深入學(xué)習(xí)C語言中memset()函數(shù)的用法
這篇文章主要介紹了深入學(xué)習(xí)C語言中memset()函數(shù)的用法,是C語言入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-08-08
C++11 寫一個只觸發(fā)一次槽函數(shù)的Qt connect函數(shù)
這篇文章主要為大家介紹了C++11 寫一個只觸發(fā)一次槽函數(shù)的Qt connect函數(shù)實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09

