贝塞尔曲线经典实例
2017-04-01 09:13
134 查看
贝塞尔曲线经典实例,直接上代码
package com.example.administrator.testapplication; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.graphics.Point; import android.util.AttributeSet; import android.view.View; /** * Created by Administrator on 2017/3/31 0031. */ public class BezierViewDemo extends View { private Paint mPaint; private Path mPath; private Point startPoint; private Point endPoint; // 辅助点 private Point assistPoint; private Point a; private Point b; private Point c; //系数 private float t = 0.0f; private boolean isAdd = true; private Runnable runnable; public BezierViewDemo(Context context) { super(context); inits(context); } public BezierViewDemo(Context context, AttributeSet attrs) { super(context, attrs); inits(context); } public BezierViewDemo(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); inits(context); } /** * 初始化 * * @param context */ private void inits(Context context) { this.context = context; mPaint = new Paint(); this.mPath = new Path(); this.startPoint = new Point(50, 150); this.endPoint = new Point(450, 150); this.assistPoint = new Point(250, 450); this.runnable = new Runnable() { @Override public void run() { invalidate(); } }; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); mPaint.setAntiAlias(true); mPaint.setStrokeWidth(10); mPaint.setStyle(Paint.Style.STROKE); mPaint.setColor(Color.RED); mPath.reset(); //起点 mPath.moveTo(startPoint.x, startPoint.y); //mPath mPath.quadTo(assistPoint.x, assistPoint.y, endPoint.x, endPoint.y); //画Path canvas.drawPath(mPath, mPaint); //画控制点 canvas.drawPoint(assistPoint.x, assistPoint.y, mPaint); //画线 mPaint.setColor(Color.YELLOW); mPath.reset(); mPath.moveTo(startPoint.x, startPoint.y); mPath.lineTo(assistPoint.x, assistPoint.y); mPath.lineTo(endPoint.x, endPoint.y); canvas.drawPath(mPath, mPaint); //画点 mPaint.setColor(Color.BLACK); canvas.drawCircle(assistPoint.x, assistPoint.y, 8, mPaint); canvas.drawCircle(startPoint.x, startPoint.y, 8, mPaint); canvas.drawCircle(endPoint.x, endPoint.y, 8, mPaint); if (t >= 1) { this.isAdd = false; } if (t <= 0) { this.isAdd = true; } if (isAdd) { t += 0.005f; } else { t -= 0.005f; } //画动态图 a = getB1(t,startPoint,assistPoint); b = getB2(t,startPoint,endPoint,assistPoint); c = getB1(t,assistPoint,endPoint); mPath.reset(); mPaint.setColor(Color.GREEN); //起点 mPath.moveTo(startPoint.x, startPoint.y); //mPath mPath.quadTo(a.x,a.y,b.x,b.y); //画Path canvas.drawPath(mPath, mPaint); //画线 canvas.drawLine(a.x,a.y,c.x,c.y,mPaint); //画点 mPaint.setColor(Color.GRAY); canvas.drawCircle(a.x,a.y,8,mPaint); canvas.drawCircle(b.x,b.y,8,mPaint); canvas.drawCircle(c.x,c.y,8,mPaint); this.postDelayed(runnable, 30); } //二次方贝塞尔曲线 private Point getB2(float t,Point sPoint,Point ePoint,Point cPoint){ int x = (int) ((1 - t) * (1 - t) * sPoint.x + 2 * t * (1 - t) * cPoint.x + t * t * ePoint.x); int y = (int) ((1 - t) * (1 - t) * sPoint.y + 2 * t * (1 - t) * cPoint.y + t * t * ePoint.y); return new Point(x,y); } //线性贝塞尔曲线 private Point getB1(float t,Point sPoint,Point ePoint){ int x = (int) ((1 - t) * sPoint.x + t * ePoint.x); int y = (int) ((1 - t) * sPoint.y + t * ePoint.y); return new Point(x,y); } }
相关文章推荐
- HTC经典实例(二)
- Tomcat+JSP经典配置实例
- Java递归算法经典实例(经典兔子问题)
- R语言经典实例 12-13章
- Java经典设计模式之五大创建型模式(附实例和详解)
- 贝塞尔曲线初探
- 半小时精通正则表达式 经典实例介绍
- BigInteger大整数类——实例和源码(相当经典)
- 正则表达式经典实例
- 贝塞尔曲线画圆角
- Tomcat+JSP经典配置实例(省的以后来是找)
- C++多线程编程(★入门经典实例★)
- java的经典实例【3】
- javascript常用经典算法实例详解
- cURL的几个经典实例
- Android开发入门经典实例
- 经典ajax实例-ajax实现输入时的自动提示jsp(转)
- Linear regression with one variable算法实例讲解(绘制图像,cost_Function ,Gradient Desent, 拟合曲线, 轮廓图绘制)_矩阵操作
- 一张图带你彻底了解二阶贝塞尔曲线
- 非常经典的asp.net验证码制作实例代码详解