安卓杂记(三)利用自定义的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绘制贝塞尔曲线,在此我就不赘述了。

可若要将一系列散点连成一条光滑的曲线,要怎么办?

你可能会回答:那还不简单?!对于每一对点绘制贝塞尔曲线不就可以了吗?然而,因为没有将所有结点当作一个整体考虑,所以造成了两点之间的曲线光滑,而整条曲线在结点处依旧突兀,那怎么办呢?嘻嘻,请听下回分解。


 

原文地址:https://www.cnblogs.com/jscitlearningshare/p/4340648.html