這篇文章主要講解了OpenGL如何繪制Bezier曲線,內(nèi)容清晰明了,對(duì)此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會(huì)有幫助。
目前創(chuàng)新互聯(lián)公司已為上千多家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)絡(luò)空間、網(wǎng)站托管維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、荷塘網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。項(xiàng)目要求:
– 使用鼠標(biāo)在屏幕中任意設(shè)置控制點(diǎn),并生成曲線
– 使用鼠標(biāo)和鍵盤的交互操作實(shí)現(xiàn)對(duì)曲線的修改。
項(xiàng)目總體介紹
本項(xiàng)目利用Bezier曲線生成算法生成可由用戶自定義的曲線。可實(shí)現(xiàn)核心功能如下:
1、用戶用鼠標(biāo)左擊屏幕任意處產(chǎn)生記錄點(diǎn)。
2、鼠標(biāo)右擊屏幕任意處由先前的任意個(gè)數(shù)記錄點(diǎn)和其先后關(guān)系生成Bezier曲線。
另有輔助輸入功能:
1、按鍵盤‘C'鍵可清除所有記錄點(diǎn)。
2、按鍵盤‘R'鍵可清除上一個(gè)記錄點(diǎn)。
3、按鍵盤‘Q'鍵可推出程序。
項(xiàng)目設(shè)計(jì)思路
1、Bezier曲線介紹:
貝塞爾曲線就是這樣的一條曲線,它是依據(jù)四個(gè)位置任意的點(diǎn)坐標(biāo)繪制出的一條光滑曲線。在歷史上,研究貝塞爾曲線的人最初是按照已知曲線參數(shù)方程來(lái)確定四個(gè)點(diǎn)的思路設(shè)計(jì)出這種矢量曲線繪制法。1962年,法國(guó)數(shù)學(xué)家Pierre Bézier第一個(gè)研究了這種矢量繪制曲線的方法,并給出了詳細(xì)的計(jì)算公式,因此按照這樣的公式繪制出來(lái)的曲線就用他的姓氏來(lái)命名是為貝塞爾曲線。
2、生成公式:
(1)線性公式(只有兩個(gè)點(diǎn)情況)
給定點(diǎn)P0、P1,線性貝茲曲線只是一條兩點(diǎn)之間的直線。這條線由下式給出:
且其等同于線性插值。
(2)二次方公式(三個(gè)點(diǎn)組成)
二次方貝茲曲線的路徑由給定點(diǎn)P0、P1、P2的函數(shù)B(t)追蹤:
TrueType字型就運(yùn)用了以貝茲樣條組成的二次貝茲曲線。
(3)三次方公式(四個(gè)點(diǎn))
P0、P1、P2、P3四個(gè)點(diǎn)在平面或在三維空間中定義了三次方貝茲曲線。曲線起始于P0走向P1,并從P2的方向來(lái)到P3。一般不會(huì)經(jīng)過(guò)P1或P2;這兩個(gè)點(diǎn)只是在那里提供方向資訊。P0和P1之間的間距,決定了曲線在轉(zhuǎn)而趨進(jìn)P3之前,走向P2方向的“長(zhǎng)度有多長(zhǎng)”。
曲線的參數(shù)形式為:
現(xiàn)代的成象系統(tǒng),如PostScript、Asymptote和Metafont,運(yùn)用了以貝茲樣條組成的三次貝茲曲線,用來(lái)描繪曲線輪廓。
(4)一般參數(shù)公式(n個(gè)點(diǎn))
階貝茲曲線可如下推斷。給定點(diǎn)P0、P1、…、Pn,其貝茲曲線即:
N階的貝茲曲線,即N-1階貝茲曲線之間的插值。
#include#include #include #include //定義控制點(diǎn)數(shù)目的大值 #define MAX_CPTX 25 int ncpts=0;//實(shí)際控制點(diǎn)個(gè)數(shù) static int width=600,height=600;//窗口大小 typedef struct { GLfloat x,y; } POINT; POINT cpts[MAX_CPTX];//存儲(chǔ)控制點(diǎn)坐標(biāo) //求n! int JieCheng(int n) { if(n==1||n==0) { return 1; } else { return n*JieCheng(n-1); } } //求組合排列 double C(int n,int i) { return ((double)JieCheng(n))/((double)(JieCheng(i)*JieCheng(n-i))); } //求一個(gè)數(shù)u的num次方 double N(double u,int n) { double sum=1.0; if (n==0) { return 1; } for(int i=0;i 另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站www.cdcxhl.com,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
文章題目:OpenGL如何繪制Bezier曲線-創(chuàng)新互聯(lián)
網(wǎng)站路徑:http://weahome.cn/article/csdipe.html