貝塞爾曲線

2021-07-27 03:17:12 字數 3764 閱讀 9733

關於貝塞爾曲線,網上很多部落格都已經給出了解釋。。。真的好多。

但是我看了幾百遍都不明白!!不知道大家跟我有沒有同樣的感受。所以就來個重點解釋,通俗易懂版給大家吧~~

下面的這個圖,相信你也看到過很多。然而,我這裡也是需要貼一下這個圖的(不知道是哪個大神的圖,不好意思,借用一下)。

引數講解

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,可...