小編這次要給大家分享的是OpenGL如何實(shí)現(xiàn)多段Bezier曲線拼接,文章內(nèi)容豐富,感興趣的小伙伴可以來了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。
我們提供的服務(wù)有:成都做網(wǎng)站、成都網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、雙河ssl等。為1000多家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的雙河網(wǎng)站制作公司運(yùn)行程序的交互方式有點(diǎn)類似corelDraw中的自由曲線繪制,或者photoShop中的鋼筆自由路徑繪制。
截圖:
將BezierCurve封裝成了一個(gè)類,代碼如下:
#ifndef _BEZIERCURVE_H #define _BEZIERCURVE_H #include "vec3.hpp" #include <vector> #include <iostream> #include <gl/glut.h> using namespace std; //// 3次bezier曲線: 四個(gè)控制節(jié)點(diǎn)。曲線經(jīng)過首末兩個(gè)頂點(diǎn)。 class BezierCurve { public: //cell一共有四個(gè)控制頂點(diǎn) // -cell經(jīng)過V0和V3頂點(diǎn), // -cell的始端相切于直線:(V0, V1) 和末端相切于(V2,V3) class BezierCell { public: BezierCell(int i0, int i1, int i2, int i3) { setValue(i0, i1, i2, i3); } void setValue(int i0, int i1, int i2, int i3) { ctrlVertxIndex[0] = i0; ctrlVertxIndex[1] = i1; ctrlVertxIndex[2] = i2; ctrlVertxIndex[3] = i3; } const int operator[](int index) const { if (index > 3 || index < 0) return -1; return ctrlVertxIndex[index]; } int ctrlVertxIndex[4]; }; enum eventType { LButtonDown = 0, MouseMove = 1, LButtonUp = 2 }; enum { Bezier3CtrlPnt = 4 }; BezierCurve() { clear(); } ~BezierCurve(){} void begin() { // 開啟求值器 glEnable(GL_MAP1_VERTEX_3); clear(); } void mouseSynchro(eventType type, const Vec3d& v) //響應(yīng)鼠標(biāo)motion { ////////////////////////////////////////////////////////////////////////// //LButtonDown: 壓入點(diǎn) if (type == LButtonDown) { if (isFirstRender) //for the first cell { vertexVector.push_back(v); //push V0... vertexVector.push_back(v); //push V1... } else if ( cellRenderState() == cellRenderImple::Push ) //for any cell { vertexVector.push_back(v); //push V2... vertexVector.push_back(v); //push V3... cellRenderState.setChange(); //set the flag to change V3 cellNum++; //increase the cell counter } } ////////////////////////////////////////////////////////////////////////// //MouseMove: 動(dòng)態(tài)更新相應(yīng)的頂點(diǎn)數(shù)據(jù) else if (type == MouseMove) { if (isFirstRender) //for the first cell { vertexVector.back() = v; //change the V1 immediately } else if ( cellRenderState() == cellRenderImple::Change )//for any cell { int vecSize = vertexVector.size(); vertexVector[vecSize-2] = v; //change the V2 immediately } } ////////////////////////////////////////////////////////////////////////// //LButtonUp: 為拼接做準(zhǔn)備 else if (type == LButtonUp) { if (isFirstRender) { //只有第一個(gè)BezierCell可以編輯bezierCell的起始段:(V0,V1) isFirstRender = false; } else if ( cellRenderState() == cellRenderImple::Change) { //if finish the current cell's render //利用v1和中點(diǎn)v0計(jì)算出v2:(v1 + v2) / 2 = v0 //next cell begin: push the next cell's V1... int vecSize = vertexVector.size(); Vec3d v0 = vertexVector[vecSize-1]; Vec3d v1 = vertexVector[vecSize-2]; Vec3d v2 = 2 * v0 - v1; vertexVector.push_back(v2); //重置cellRenderFlag cellRenderState.setPush(); } } ////////////////////////////////////////////////////////////////////////// //更新數(shù)組的長度 _updateVertexNum(); } void end() { glDisable(GL_MAP1_VERTEX_3); } void renderCurve() { ////////////////////////////////////////////////////////////////////////// //rendering vertex... for (int i=0; i<vertexVector.size(); i++) { Vec3d v = vertexVector[i]; glBegin(GL_POINTS); glVertex3dv(v.getValue()); glEnd(); } ////////////////////////////////////////////////////////////////////////// //rendering moving tangent(切線) //(vertexNum-1, vertexNum-2) if ( vertexNum>=2 ) { glEnable(GL_LINE_STIPPLE); { glLineStipple(1, 0x0101); glBegin(GL_LINES); { Vec3d v1 = vertexVector[vertexNum-1]; Vec3d v2 = vertexVector[vertexNum-2]; glVertex3dv(v1.getValue()); glVertex3dv(v2.getValue()); } glEnd(); }glDisable(GL_LINE_STIPPLE); } ////////////////////////////////////////////////////////////////////////// //if ( !_check() ) // return; //rendering bezier cells... system("CLS"); for (int i=0; i<cellNum; i++) { int pos = i * 3; if ( (pos+3) < vertexNum ) renderBezierCell( BezierCell(pos, pos+1, pos+2, pos+3) ); } ////////////////////////////////////////////////////////////////////////// } // 3次bezier曲線經(jīng)過vetex0和vextex3 void renderBezierCell(const BezierCell& cell) { double *pBuffer = new double[Bezier3CtrlPnt * 3]; cout << "----------------------------------------------------" << endl; cout << "Vertex number : " << vertexNum << endl; cout << "Cell number : " << cellNum << endl; cout << "The render cell: " << cell[0] << " " << cell[1] << " " << cell[2] << " " << cell[3] << endl; for (int i = 0, bg = 0; i<4; i++) { Vec3d v = vertexVector[ cell[i] ]; pBuffer[bg++] = v.x(); pBuffer[bg++] = v.y(); pBuffer[bg++] = v.z(); cout << v.x() << " " << v.y() << " " << v.z() << endl; }cout << "----------------------------------------------------" << endl; glMap1d(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, Bezier3CtrlPnt, pBuffer); glBegin(GL_LINE_STRIP); { for (int i = 0; i <= 30; i++) glEvalCoord1f((GLfloat) i/30.0f); } glEnd(); delete pBuffer; pBuffer = 0; } void clear() { cellNum = 0; vertexNum = 0; isFirstRender = true; vertexVector.clear(); } protected: bool _check() { vertexNum =vertexVector.size(); return vertexNum == (cellNum - 1) * 3 + 4; } void _updateVertexNum() { vertexNum=vertexVector.size();} int cellNum; //單元個(gè)數(shù) int vertexNum; //頂點(diǎn)個(gè)數(shù) bool isFirstRender; //首次標(biāo)志 std::vector<Vec3d> vertexVector; //頂點(diǎn)數(shù)組 class cellRenderImple { public: enum RenderStep { Push = 0, Change = 1 }; cellRenderImple(){ setPush(); } bool operator()(void) { return flag; } void setPush() { flag = Push; } void setChange() { flag = Change; } RenderStep flag; //cell的渲染狀態(tài) } cellRenderState; };
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站jinyejixie.com,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
文章標(biāo)題:OpenGL如何實(shí)現(xiàn)多段Bezier曲線拼接-創(chuàng)新互聯(lián)
網(wǎng)頁路徑:http://jinyejixie.com/article26/dishcg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、自適應(yīng)網(wǎng)站、定制開發(fā)、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容