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

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

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


     

  • 相关阅读:
    移动端页面制作字号大小设定问题,设计稿文字字号规范,解决移动端大小屏适配问题
    iPhone分辨率详细对比
    Flex 布局教程:语法篇
    带有可点击区域的图像映射(area)
    Stellar.js视差插件
    json中含有换行符' ',' '的处理
    windows下基于(QPC)实现的微秒级延时
    实现memcpy()函数及过程总结
    Welcome to MarkdownPad 2
    Cmake+Opencv+mingw+QT环境配置
  • 原文地址:https://www.cnblogs.com/jscitlearningshare/p/4340648.html
Copyright © 2011-2022 走看看