前言:
近来在做安卓项目时,与贝塞图交过几个回合,终卡在了一个棘手的问题上:如何将一系列的散点连成一条光滑的曲线?在网上查阅资料无数,终得解决之道,即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绘制贝塞尔曲线,在此我就不赘述了。
可若要将一系列散点连成一条光滑的曲线,要怎么办?
你可能会回答:那还不简单?!对于每一对点绘制贝塞尔曲线不就可以了吗?然而,因为没有将所有结点当作一个整体考虑,所以造成了两点之间的曲线光滑,而整条曲线在结点处依旧突兀,那怎么办呢?嘻嘻,请听下回分解。