關於貝塞爾曲線,網上很多部落格都已經給出了解釋。。。真的好多。
但是我看了幾百遍都不明白!!不知道大家跟我有沒有同樣的感受。所以就來個重點解釋,通俗易懂版給大家吧~~
下面的這個圖,相信你也看到過很多。然而,我這裡也是需要貼一下這個圖的(不知道是哪個大神的圖,不好意思,借用一下)。
引數講解
p0是曲線的開始點
p3是曲線的結束點
p1和p2是控制曲線走勢的控制點,所以這兩個點事實上是輔助作用,並不會在畫布中被繪製出來
t引數重點講解
t是輔助引數,可以看到它的值範圍是[0,1]。這個t值作用於圖中的所有直線(p0p1、p1p2、p2p3、兩條綠線、藍線)。
注意:圖中真實繪製出來的,就只有紅線,其他的都只是輔助的,並不會被真實繪製出來。
在上圖中,你可以看成這個三次貝塞爾曲線由兩個二次貝塞爾曲線組成。1.p0p1p2組成的二次貝塞爾曲線 2.p1p2p3組成的二次貝塞爾曲線。
所以要把上圖的三次貝塞爾曲線拆分成兩個二次貝塞爾曲線講解
例如:對於第乙個二次貝塞爾曲線p0p1p2,
當t=0.5的時候(其實就是[0,1]的中間值,這個比較好理解),情況應該是這樣的:
1.找到p0p1線(方向p0->p1,這是有方向的線段)的50% (因為t=0.5,即0.5*100%) 的位置,標上乙個綠色的點
2.同1步驟,在p1p2線上的50%位置上標上乙個綠色的點
3.把步驟1和2的綠色點連成一條線
4.然後在這條綠色的50%位置處標上乙個紅點,這個紅點就是實際繪製的曲線中的乙個點。(當t值不斷變化,就會出現不同位置的紅點,組成一條曲線)
同理,第二個二次貝塞爾曲線的理解跟第乙個二次貝塞爾曲線一樣!
------------------------ 我不是分割線 ------------------------------------
注意:1、雙三次貝塞爾曲線的4條邊界都是三次貝塞爾曲線,其特徵網路有16個頂點。
2、opengl中的賽貝爾曲線:
求值器opengl提供了一些函式來繪製貝塞爾曲線和曲面。我們只需要提供控制點和u,v作為引數,然後呼叫求值函式來繪製曲線。
2d曲線的例子:
//控制點 glint numofpoints = 4; static glfloat controlpoints[4][3] = ,,,
}; void setuprc()
//畫控制點
void drawpoints()
glend();
} void changesize(glsizei w, glsizei h)
glviewport(0, 0, w, h);
//使用正交投影
在renderscene函式中呼叫glmap1f來為曲線建立對映。第乙個引數為gl_map1_vertex3,設定求值器產生頂點為三元組(x,y,z).還可以設定為產生紋理座標和顏色資訊。參考glmap1.後面的兩個引數設定了u的取值範圍[0,100],第四個引數指定了頂點在陣列中的間隔,由於頂點是由3個浮點數組成,所以間隔是3.第五個引數指定了控制點的個數,最後乙個引數是控制點陣列。然後我們需要啟用求值器,呼叫如下:
glenable(gl_map1_vertex3);
glevalcoord1f函式,接受乙個引數為曲線的引數值。呼叫這個函式會通過求值函式求出頂點座標值,然後內部呼叫了glvertex。這裡使用連線的方式來連線這些頂點:
glbegin(gl_line_strip);
for(i = 0; i <= 100; i++)
glend();
計算曲線
opengl還提供了更簡單的方式來完成上面的任務。我們可以通過glmapgrid函式來設定乙個網格,來告訴opengl在u的值域的範圍內建立乙個包含各個點的空間對稱的網格。然後,我們呼叫glevalmesh,使用指定的圖元(gl_line或gl_points)來鏈結各個點。
我們用下面的兩個函式呼叫
glmapgrid1f(100, 0.0f, 100.0f);
glevalmesh1(gl_line, 0, 100);
可以替換下面的**
glbegin(gl_line_strip);
for (int i = 0
; i <= 100; i++)
glend();
使用這種方式更為緊湊。
3d表面
建立乙個貝塞爾曲面與建立乙個貝塞爾曲線類似。除了給出u的定義域之外,還要給出v的定義域。下面的例子是建立乙個貝塞爾曲面。與之前不同的是,我們沿著v的定義域定義了3組控制點。為了保持曲面的簡單,這幾組控制點只是z值不同。用這種方式畫的曲面,看起來像是曲線沿z軸的擴充套件。
//控制點 glint nnumpoints = 3;
glfloat ctrlpoints[3][3][3]= ,
,
},,
,
},,
,
}}; //畫控制點 void drawpoints(void)
void renderscene(void)
在這裡我們用glmap2f替換了之前的glmap1f, 這個函式指定了u和v兩個域上的點。除了指定u的上界和下界之外,還要指定v的上界和下界。v定義域內點的距離是9,因為這裡使用了3維陣列,包含了3個u值,每個u值又包含了3個點,3x3=9。然後指定v方向上的階,即每個u分支上v方向有多少個點。最後乙個引數是指向控制點的指標。
然後我們設定求值器.
//啟用求值器
glenable(gl_map2_vertex_3);
//從0到10對映乙個包含10個點的網格
glmapgrid2f(10,0.0f,10.0f,10,0.0f,10.0f);
計算網格網格表面,用線的方式表示。
// 計算網格
光照和法線
求值器還可以幫我們生成表面的法線,只需簡單的修改一些**:
把glevalmesh2(gl_line, 0, 10, 0, 10);替換為glevalmesh2(gl_fill, 0, 10, 0, 10);然後在初始化時 setuprc中呼叫glenable(gl_auto_normal);就可以得到乙個收到光照的曲面了。
貝塞爾曲線
1.概述 貝塞爾曲線 b zier curve 又稱 貝茲曲線或貝濟埃曲線,是應用於二維圖形應用程式的數學曲線。一般的向量圖形 軟體通過它來精確畫出曲線,貝茲曲線由 線段與節點組成,節點是可拖動的支點,線段像可伸縮的皮筋,我們在繪圖工具上看到的鋼筆工具就是來做這種向量曲線的。貝塞爾曲線是計算機圖形學...
貝塞爾曲線
由於工作需要,最近在研究乙個類似qq訊息劃掉的效果 很多強迫症患者童鞋對這個簡直是愛不釋手,當然這個也包括我自己 貝塞爾曲線就是這樣的一條曲線,它是依據四個位置任意的點座標繪製出的一條 光滑曲線 在歷史上,研究貝塞爾曲線的人最初是按照已知曲線 引數方程 來確定四個點的思路設計出這種向量曲線繪製法。貝...
貝塞爾曲線
貝塞爾曲線在android中運用廣泛,可以用來繪製各類複雜曲線,因為貝塞爾曲線只需要指定控制點,就能繪製出特定的曲線。其次是做點和點的平滑過渡。為什麼可以做到如上兩點,看下面的講解 首先來說,貝塞爾曲線有階的概念,這個階可以理解為控制點,一階的控制點只有兩個。如上是一階的方程,其中t取值為0到1,可...