安卓雜記(三)利用自定義的PolyBezier()函數將一系列散點繪製成光滑曲線(一)

前言:

近來在做安卓項目時,與貝塞圖交過幾個回合,終卡在了一個棘手的問題上:如何將一系列的散點連成一條光滑的曲線?在網上查閱資料無數,終得解決之道,即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繪製貝塞爾曲線,在此我就不贅述了。

可若要將一系列散點連成一條光滑的曲線,要怎麼辦?

你可能會回答:那還不簡單?!對於每一對點繪製貝塞爾曲線不就可以了嗎?然而,因爲沒有將所有結點當作一個整體考慮,所以造成了兩點之間的曲線光滑,而整條曲線在結點處依舊突兀,那怎麼辦呢?嘻嘻,請聽下回分解。


 

 

 

發佈了29 篇原創文章 · 獲贊 12 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章