贝塞尔曲线经典实例

贝塞尔曲线经典实例,直接上代码



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);
    }
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
从2阶到7阶的贝赛尔曲线 private static final int MAX_COUNT = 7; // 贝塞尔曲线最大阶数 private static final int REGION_WIDTH = 30; // 合法区域宽度 private static final int FINGER_RECT_SIZE = 60; // 矩形尺寸 private static final int BEZIER_WIDTH = 10; // 贝塞尔曲线线宽 private static final int TANGENT_WIDTH = 6; // 切线线宽 private static final int CONTROL_WIDTH = 12; // 控制点连线线宽 private static final int CONTROL_RADIUS = 12; // 控制点半径 private static final int TEXT_SIZE = 40; // 文字画笔尺寸 private static final int TEXT_HEIGHT = 60; // 文本高度 private static final int RATE = 10; // 移动速率 private static final int HANDLER_WHAT = 100; private static final int FRAME = 1000; // 1000帧 private static final String[] TANGENT_COLORS = {"#7fff00", "#7a67ee", "#ee82ee", "#ffd700", "#1c86ee", "#8b8b00"}; // 切线颜色 private static final int STATE_READY = 0x0001; private static final int STATE_RUNNING = 0x0002; private static final int STATE_STOP = 0x0004; private static final int STATE_TOUCH = 0x0010; private Path mBezierPath = null; // 贝塞尔曲线路径 private Paint mBezierPaint = null; // 贝塞尔曲线画笔 private Paint mMovingPaint = null; // 移动点画笔 private Paint mControlPaint = null; // 控制点画笔 private Paint mTangentPaint = null; // 切线画笔 private Paint mLinePaint = null; // 固定线画笔 private Paint mTextPointPaint = null; // 点画笔 private Paint mTextPaint = null; // 文字画笔 private ArrayList mBezierPoints = null; // 贝塞尔曲线点集 private PointF mBezierPoint = null; // 贝塞尔曲线移动点 private ArrayList mControlPoints = null; // 控制点集 private ArrayList<ArrayList<ArrayList>> mTangentPoints; // 切线点集 private ArrayList<ArrayList> mInstantTangentPoints; private int mR = 0; // 移动速率 private int mRate = RATE; // 速率 private int mState; // 状态 private boolean mLoop = false; // 设置是否循环 private boolean mTangent = true; // 设置是否显示切线 private int mWidth = 0, mHe

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值