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

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

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


     

  • 相关阅读:
    HTTP Handlers and HTTP Modules Overview
    NTLM Detail
    How to get report service instance name by wmi
    How to remove the history credential in IE8 .(OP is Win 7 64)
    Session 机制详解
    ES6map对象,for of 遍历,class类,extends继承
    MongoDB 安装及命令指令符基本操作
    nodeIO,path,http , url模块
    ES6promise
    node模块化简介, process全局对象, fs模块,Buffer对象 ,
  • 原文地址:https://www.cnblogs.com/jscitlearningshare/p/4340648.html
Copyright © 2020-2023  润新知