數學之美 貝塞爾曲線

2021-05-27 07:45:04 字數 2246 閱讀 3851

自從上個世紀60年代,雷諾汽車公司第一次把由手工設計車體(粘土)的任務轉到由計算機來完成,二維的貝塞爾曲線就成了計算機圖形學中最有用的曲線之一(繼直線和橢圓之後)。在postscript中,所有曲線都用貝塞爾曲線表示——橢圓線也用貝塞爾曲線來逼近,貝塞爾曲線也用於定義postscript字型的字元輪廓。今天的我們要感謝pierm bezier,是他通過一些數學的計算和推導,最後找到了這套近乎完美的曲線公式,它的作用毫不遜於數學當中另乙個奇蹟——**分割點。不僅僅如此,其實自然界中,看似紛繁複雜的萬事萬物沒有哪乙個不蘊含著它自身的規律,或許它們就是乙個乙個完美的奇蹟,等著用數學去發現。

貝塞爾曲線之所以被廣泛的應用於計算機的輔助設計,是因為貝塞爾樣條(公式)具有以下幾個重要的特點:

第一,貝塞爾樣條常常比較具有美感,這是乙個公認的主觀評價;

第二,經過不斷的調整,貝塞爾樣條可以逼近任意的形狀;

第三,貝塞爾樣條總是由其兩個端點開始和結束的,因此它非常好控制;

第四,貝塞爾樣條沒有奇點,這在計算機的設計中是非常重要的。事實上,貝塞爾曲線總是受限於由端點和控制點連線而成的四邊形(稱作「凸包」)。

第五,貝塞爾曲線總是與第乙個控制點到起點的直線相切,並保持同一方向;同時,也與第二個控制點到終點的直線相切,並保持同一方向。

一條二維的貝塞爾樣條是由4個點定義的,兩個端點和兩個控制點。假設起點是(x0,y0),終點是(x3,y3),兩個控制點分別是(x1,y1)和(x2,y2),下面是貝塞爾樣條的引數方程:

x(t) = (1-t)3x0 + 3t(1-t)2x1+ 3t2(1-t)x2 + t3x3

y(t) = (1-t)3y0 + 3t(1-t)2y1+ 3t2(1-t)y2 + t3y3

其中,t 的值從0到1變化,這樣就可以畫出曲線。

在實際的程式設計中,即使不知道上面的公式也可以使用貝塞爾樣條。在window api中,有現成的函式供呼叫,利用該函式可以畫一條或多條連線的貝塞爾樣條:polybezier(hdc,apt,icount)。這個函式中,hdc是裝置描述表控制代碼;apt是point結構的陣列,前四個點依次給出貝塞爾曲線的起點、第乙個控制點、第二個控制點和終點,此後的每一條貝塞爾曲線只需給出三個點,因為後一條貝塞爾曲線的起點就是前一條貝塞爾曲線的終點,如此類推;icount是陣列中點的個數,它的值等於1加上所繪製的曲線條數的三倍。

另外要注意,在畫一系列的貝塞爾樣條時,只有當第一條貝塞爾曲線的第二個控制點、第一條貝塞爾曲線的終點(也是第二條貝塞爾曲線的起點)和第二條貝塞爾曲線的第乙個控制點線性相關時,也就是這三個點在同一條直線上時,曲線在連線點處才是光滑的。

下面是乙個互動式的程式,利用上面的這個函式畫了一條二維的貝塞爾曲線。程式中,這條貝塞爾曲線的兩個控制點,可以通過按住滑鼠左鍵或右鍵拖動滑鼠分別進行改動。程式的原始碼如下:

///

// bezier.c檔案

#include

lresult callback wndproc(hwnd,uint,wparam,lparam);

void drawbezier(hdc hdc,point apt);

int winapi winmain(hinstance hinstance,hinstance hprevinstance,

lpstr lpcmdline,int nshowcmd)

return msg.wparam;

}lresult callback wndproc(hwnd hwnd,uint message,wparam wparam,lparam lparam)

if(wparam & mk_rbutton)

selectobject(hdc,getstockobject(black_pen));

drawbezier(hdc,apt); //使用黑色的筆重新畫

releasedc(hwnd,hdc);

} return 0;

case wm_paint:

invalidaterect(hwnd,null,true);

hdc = beginpaint(hwnd,&ps);

drawbezier(hdc,apt);

endpaint(hwnd,&ps);

return 0;

case wm_destroy:

postquitmessage(0);

return 0;

} return defwindowproc(hwnd,message,wparam,lparam);

}void drawbezier(hdc hdc,point apt)

貝塞爾曲線

1.概述 貝塞爾曲線 b zier curve 又稱 貝茲曲線或貝濟埃曲線,是應用於二維圖形應用程式的數學曲線。一般的向量圖形 軟體通過它來精確畫出曲線,貝茲曲線由 線段與節點組成,節點是可拖動的支點,線段像可伸縮的皮筋,我們在繪圖工具上看到的鋼筆工具就是來做這種向量曲線的。貝塞爾曲線是計算機圖形學...

貝塞爾曲線

由於工作需要,最近在研究乙個類似qq訊息劃掉的效果 很多強迫症患者童鞋對這個簡直是愛不釋手,當然這個也包括我自己 貝塞爾曲線就是這樣的一條曲線,它是依據四個位置任意的點座標繪製出的一條 光滑曲線 在歷史上,研究貝塞爾曲線的人最初是按照已知曲線 引數方程 來確定四個點的思路設計出這種向量曲線繪製法。貝...

貝塞爾曲線

貝塞爾曲線在android中運用廣泛,可以用來繪製各類複雜曲線,因為貝塞爾曲線只需要指定控制點,就能繪製出特定的曲線。其次是做點和點的平滑過渡。為什麼可以做到如上兩點,看下面的講解 首先來說,貝塞爾曲線有階的概念,這個階可以理解為控制點,一階的控制點只有兩個。如上是一階的方程,其中t取值為0到1,可...