三阶贝塞尔曲线绘制一个近似的圆方案
来源:互联网 发布:冰毒淘宝地址 编辑:程序博客网 时间:2024/05/17 04:23
详见:http://spencermortensen.com/articles/bezier-circle/
近似值:c = 0.551915024494f
坐标系参考图:
结果:
package com.louisgeek.louiscustomviewstudy;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Path;import android.graphics.PointF;import android.util.AttributeSet;import android.view.View;/** * Created by louisgeek on 2016/10/28. */public class BezierCurveViewDrawCircle extends View { /** * 控制点和半径的比例 详见:http://spencermortensen.com/articles/bezier-circle/ */ private final float C = 0.551915024494f; private Paint mPaint; private int mWidth,mHeight; private float mDisance;//控制点离数据点的距离 //顺时针 private PointF[] mPointF_Data; private PointF[] mPointF_Control; boolean drawControl=true; float mRadius=150f; public BezierCurveViewDrawCircle(Context context) { this(context, null); } public BezierCurveViewDrawCircle(Context context, AttributeSet attrs) { this(context, attrs,0); } public BezierCurveViewDrawCircle(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { mPaint = new Paint(); mPaint.setColor(Color.RED); mPaint.setStrokeWidth(4f); mPaint.setStyle(Paint.Style.STROKE); // mDisance=mRadius*C; /** * init */ mPointF_Data=new PointF[2*4]; for (int i = 0; i < mPointF_Data.length; i++) { mPointF_Data[i]=new PointF(); } mPointF_Control=new PointF[2*4]; for (int i = 0; i < mPointF_Control.length; i++) { mPointF_Control[i]=new PointF(); } //图解 https://code.aliyun.com/hi31588535/outside_chain/raw/master/jiangjietu.png //屏幕坐标系的第一象限 mPointF_Data[0].set(mRadius,0);//点P3 mPointF_Data[1].set(0,mRadius);//点P0 //屏幕坐标系的第二象限 mPointF_Data[2].set(0,mRadius);//点P0 mPointF_Data[3].set(-mRadius,0);//点P9 //屏幕坐标系的第三象限 mPointF_Data[4].set(-mRadius,0);//点P9 mPointF_Data[5].set(0,-mRadius);//点P6 //屏幕坐标系的第四象限 mPointF_Data[6].set(0,-mRadius);//点P6 mPointF_Data[7].set(mRadius,0);//点P3 //屏幕坐标系的第一象限 mPointF_Control[0].set(mRadius,mDisance);//点P2 mPointF_Control[1].set(mDisance,mRadius);//点P1 //屏幕坐标系的第二象限 mPointF_Control[2].set(-mDisance,mRadius);//点P11 mPointF_Control[3].set(-mRadius,mDisance);//点P10 //屏幕坐标系的第三象限 mPointF_Control[4].set(-mRadius,-mDisance);//点P8 mPointF_Control[5].set(-mDisance,-mRadius);//点P7 //屏幕坐标系的第四象限 mPointF_Control[6].set(mDisance,-mRadius);//点P5 mPointF_Control[7].set(mRadius,-mDisance);//点P4 } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); mWidth=getMeasuredWidth(); mHeight=getMeasuredHeight(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.translate(mWidth/2,mHeight/2); Path path=new Path(); //屏幕坐标系的第1象限 path.moveTo(mPointF_Data[0].x,mPointF_Data[0].y); path.cubicTo(mPointF_Control[0].x,mPointF_Control[0].y,mPointF_Control[1].x,mPointF_Control[1].y,mPointF_Data[1].x,mPointF_Data[1].y); //屏幕坐标系的第2象限 path.moveTo(mPointF_Data[2].x,mPointF_Data[2].y); path.cubicTo(mPointF_Control[2].x,mPointF_Control[2].y,mPointF_Control[3].x,mPointF_Control[3].y,mPointF_Data[3].x,mPointF_Data[3].y); //屏幕坐标系的第3象限 path.moveTo(mPointF_Data[4].x,mPointF_Data[4].y); path.cubicTo(mPointF_Control[4].x,mPointF_Control[4].y,mPointF_Control[5].x,mPointF_Control[5].y,mPointF_Data[5].x,mPointF_Data[5].y); //屏幕坐标系的第4象限 path.moveTo(mPointF_Data[6].x,mPointF_Data[6].y); path.cubicTo(mPointF_Control[6].x,mPointF_Control[6].y,mPointF_Control[7].x,mPointF_Control[7].y,mPointF_Data[7].x,mPointF_Data[7].y); canvas.drawPath(path,mPaint); if (drawControl){ drawControlLine(canvas); } } private void drawControlLine(Canvas canvas) { mPaint.setColor(Color.GRAY); canvas.drawLine(mPointF_Data[0].x,mPointF_Data[0].y,mPointF_Control[0].x,mPointF_Control[0].y,mPaint); mPaint.setColor(Color.YELLOW); canvas.drawLine(mPointF_Data[1].x,mPointF_Data[1].y,mPointF_Control[1].x,mPointF_Control[1].y,mPaint); mPaint.setColor(Color.LTGRAY); canvas.drawLine(mPointF_Data[2].x,mPointF_Data[2].y,mPointF_Control[2].x,mPointF_Control[2].y,mPaint); mPaint.setColor(Color.parseColor("#5DFED0")); canvas.drawLine(mPointF_Data[3].x,mPointF_Data[3].y,mPointF_Control[3].x,mPointF_Control[3].y,mPaint); mPaint.setColor(Color.BLACK); canvas.drawLine(mPointF_Data[4].x,mPointF_Data[4].y,mPointF_Control[4].x,mPointF_Control[4].y,mPaint); mPaint.setColor(Color.BLUE); canvas.drawLine(mPointF_Data[5].x,mPointF_Data[5].y,mPointF_Control[5].x,mPointF_Control[5].y,mPaint); mPaint.setColor(Color.GREEN); canvas.drawLine(mPointF_Data[6].x,mPointF_Data[6].y,mPointF_Control[6].x,mPointF_Control[6].y,mPaint); mPaint.setColor(Color.parseColor("#FE6EEB")); canvas.drawLine(mPointF_Data[7].x,mPointF_Data[7].y,mPointF_Control[7].x,mPointF_Control[7].y,mPaint); }}
0 0
- 三阶贝塞尔曲线绘制一个近似的圆方案
- android绘制一个圆柱的螺线曲线
- 贴一个绘制曲线的代码
- 绘制一个周期内的余弦曲线
- 利用GDI+、贝塞尔曲线绘制一个带曲线的矩形
- VC 曲线的绘制
- Bezier曲线的绘制
- Bezier曲线的绘制
- Bezier曲线的绘制
- ROC曲线的绘制
- ROC曲线的绘制
- ROC曲线的绘制
- 利用Math类的方法,打印一个近似圆
- [VB.NET]曲线的绘制!!!
- VC绘制曲线的学习
- 锥形螺旋曲线的绘制
- 环形螺旋曲线的绘制
- 绘制你的积极性曲线
- log4j日志优先级问题和自定义优先级
- ECMAScript6标准Set和Map的使用
- 处理前段文本溢出,多余内容显示点点
- javascript中的方法回调和父页面Iframe的方法调用
- Spring方法拦截器MethodInterceptor
- 三阶贝塞尔曲线绘制一个近似的圆方案
- 多线程传参及多线程并发量控制
- JAVA日志
- 匿名自执行函数中,若存在多个执行函数,则只执行最末一个函数
- 菜鸟IDEA环境下学mavne+springmvc笔记
- OpenCv中批量读取图片数据并显示出来的C++程序
- android中线程池
- react-native-Button-TouchableOpacity
- LeetCode 9.Palindrome Number 回文数算法