前言:
近來在做安卓項目時,與貝塞圖交過幾個回合,終卡在了一個棘手的問題上:如何將一系列的散點連成一條光滑的曲線?在網上查閱資料無數,終得解決之道,即PolyBezier()函數,然安卓裏並不含此函數,遂仔細研究,自構PolyBezier()函數,看客莫急,且聽我細細道來,這要從貝塞圖說起:
一.貝塞爾曲線詳解
貝塞爾曲線(Bézier curve),又稱貝茲曲線或貝濟埃曲線,是應用於二維圖形應用程序的數學曲線。一般的矢量圖形軟件通過它來精確畫出曲線,貝茲曲線由線段與節點組成,節點是可拖動的支點,線段像可伸縮的皮筋,我們在繪圖工具上看到的鋼筆工具就是來做這種矢量曲線的。貝塞爾線是計算機圖形學中相當重要的參數曲線,在一些比較成熟的位圖軟件中也有貝塞爾曲線工具,如PhotoShop等。
至於貝塞爾曲線公式就沒有必要了解了,感興趣的話可以找度娘:http://baike.baidu.com/link?url=IpeTp9K_UAO_L73TleJbmvCOL5I3HIW26Dh1LiZDZq9PU6SY60NDV9RMmneUNVtZMKk_QehoxJhLDt8ykGzDRq
二.利用Android中的Canvas繪製貝塞爾曲線
MyActivity.java
public class MyActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
init();
}
private void init() {
LinearLayout layout=(LinearLayout) findViewById(R.id.root);
final DrawView view=new DrawView(this);
view.setMinimumHeight(500);
view.setMinimumWidth(300);
//通知view組件重繪
view.invalidate();
layout.addView(view);
}
}
通過自定義View組件重寫View組件的onDraw(Canvase)方法,就可以在該 Canvas上繪製出貝塞爾曲線。
DrawView.java
public class DrawView extends View {
public DrawView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 創建畫筆
Paint p = new Paint();
p.setColor(Color.RED);// 設置紅色
//畫貝塞爾曲線
canvas.drawText("畫貝塞爾曲線:", 10, 310, p);
p.reset();
p.setStyle(Paint.Style.STROKE);
p.setColor(Color.GREEN);
Path path2=new Path();
path2.moveTo(100, 320);//設置Path的起點
path2.quadTo(150, 310, 170, 400); //設置貝塞爾曲線的控制點座標和終點座標
canvas.drawPath(path2, p);//畫出貝塞爾曲線
}
}
當然也可以使用SurfaceView繪製貝塞爾曲線,在此我就不贅述了。
可若要將一系列散點連成一條光滑的曲線,要怎麼辦?
你可能會回答:那還不簡單?!對於每一對點繪製貝塞爾曲線不就可以了嗎?然而,因爲沒有將所有結點當作一個整體考慮,所以造成了兩點之間的曲線光滑,而整條曲線在結點處依舊突兀,那怎麼辦呢?嘻嘻,請聽下回分解。