電腦繪圖

编辑

由于需要點陣化更精细的解析度时,重新插值(補點)的计算量较小,貝茲曲線被广泛地在计算机图形中用来为平滑曲线建立模型。貝茲曲線是矢量图形文件和相应软件(如PostScript、PDF等)能够处理的唯一曲线,用于光滑地近似其他曲线。

二次和三次貝茲曲線最为常用。

程式範例

编辑

下列程式碼為一簡單的實際運用範例,展示如何使用C語言標出三次方貝茲曲線。注意,此處僅簡單的計算多項式係數,並讀盡一系列由0至1的t值;實踐中一般不會這麼做,遞歸求解通常會更快速——以更多的記憶體為代價,花費較少的處理器時間。不過直接的方法較易於理解並產生相同結果。以下程式碼已使運算更為清晰。實踐中的最佳化會先計算係數一次,並在實際計算曲線點的迴圈中反複使用。此處每次都會重新計算,損失了效率,但程式碼更清楚易讀。

曲線的計算可在曲線陣列上將相連點畫上直線——點越多,曲線越平滑。

在部分架構中,下以程式碼也可由動態规划進行最佳化。舉例來說,dt是一個常數,cx * t則等同於每次反覆就修改一次常數。經反覆應用這種最佳化後,迴圈可被重寫為沒有任何乘法(雖然這個過程不是穩定數值的)。

/*

產生三次方貝茲曲線的程式碼

*/

typedef struct

{

float x;

float y;

}

Point2D;

/*

cp在此是四個元素的陣列:

cp[0]為起始點,或上圖中的P0

cp[1]為第一個控制點,或上圖中的P1

cp[2]為第二個控制點,或上圖中的P2

cp[3]為結束點,或上圖中的P3

t為參數值,0 <= t <= 1

*/

Point2D PointOnCubicBezier( Point2D* cp, float t )

{

float ax, bx, cx;

float ay, by, cy;

float tSquared, tCubed;

Point2D result;

/*計算多項式係數*/

cx = 3.0 * (cp[1].x - cp[0].x);

bx = 3.0 * (cp[2].x - cp[1].x) - cx;

ax = cp[3].x - cp[0].x - cx - bx;

cy = 3.0 * (cp[1].y - cp[0].y);

by = 3.0 * (cp[2].y - cp[1].y) - cy;

ay = cp[3].y - cp[0].y - cy - by;

/*計算位於參數值t的曲線點*/

tSquared = t * t;

tCubed = tSquared * t;

result.x = (ax * tCubed) + (bx * tSquared) + (cx * t) + cp[0].x;

result.y = (ay * tCubed) + (by * tSquared) + (cy * t) + cp[0].y;

return result;

}

/*

ComputeBezier以控制點cp所產生的曲線點,填入Point2D結構的陣列。

呼叫者必須分配足夠的記憶體以供輸出結果,其為

*/

void ComputeBezier( Point2D* cp, int numberOfPoints, Point2D* curve )

{

float dt;

int i;

dt = 1.0 / ( numberOfPoints - 1 );

for( i = 0; i < numberOfPoints; i++)

curve[i] = PointOnCubicBezier( cp, i*dt );

}

另一種貝茲曲線的應用是在動畫中,描述物件的運動路徑等等。此處,曲線的x、y位置不用來標示曲線,但用來表示圖形位置。當用在這種形式時,連續點之間的距離會變的更為重要,且大多不是平均比例。點將會串的更緊密,控制點更接近每一個點,而更為稀疏的控制點會散的更開。如果需要線性運動速度,進一步處理時就需要循所需路徑將點平均分散。