文章目录
- 一、贝塞尔曲线递归算法
- 二、贝塞尔曲线递归算法实现
贝塞尔曲线参考 : https://github.com/venshine/BezierMaker
一、贝塞尔曲线递归算法
一阶贝塞尔曲线 ( 起止点
个控制点 =
个点 ) 是一条直线 , 贝塞尔曲线上的点就是直线上的点 ;
二阶贝塞尔曲线 ( 起止点
个控制点 =
个点 ) 由
条 一阶贝塞尔曲线 确定 ,
三阶贝塞尔曲线 ( 起止点
个控制点 =
个点 ) 由
条 二阶贝塞尔曲线 确定 ,
四阶贝塞尔曲线 ( 起止点
个控制点 =
个点 ) 由
条 三阶贝塞尔曲线 确定 ,
阶贝塞尔曲线 ( 起止点
个控制点 =
个点 ) 由
条
阶贝塞尔曲线 确定 ;
贝塞尔曲线递推公式如下 :
上述公式中
是贝塞尔曲线的阶数 ,
表示顶点序号 ;
根据上述 贝塞尔曲线递推公式 , 可以得到一个递归算法 , 算法核心公式如下 :
上述递推公式中 ,
表示贝塞尔曲线的阶数 ,
表示贝塞尔曲线中的点个数 ( 包含起止点 控制点 ) ,
表示比例取值范围
~
;
递归算法的递归终点是取到第
阶 ;
二、贝塞尔曲线递归算法实现
递归算法中最终的一阶贝塞尔曲线上的点计算公式如下 :
根据上述计算公式 , 得到如下代码 :
代码语言:javascript复制(1 - u) * mControlPoints.get(j).x u * mControlPoints.get(j 1).x
完整的贝塞尔曲线上的点坐标算法如下 :
- BezierX 方法用于计算 贝塞尔曲线上的 X 轴坐标点 ;
- BezierY 方法用于计算 贝塞尔曲线上的 Y 轴坐标点 ;
// 贝塞尔曲线控制点集合
private ArrayList<PointF> mControlPoints = new ArrayList<>();
/**
* 贝塞尔曲线递归算法, 本方法计算 X 轴坐标值
* @param i 贝塞尔曲线阶数
* @param j 贝塞尔曲线控制点
* @param u 比例 / 时间 , 取值范围 0.0 ~ 1.0
* @return
*/
private float BezierX(int i, int j, float u) {
if (i == 1) {
// 递归退出条件 : 贝塞尔曲线阶数 降为一阶
// 一阶贝塞尔曲线点坐标 计算如下 :
return (1 - u) * mControlPoints.get(j).x u * mControlPoints.get(j 1).x;
}
return (1 - u) * BezierX(i - 1, j, u) u * BezierX(i - 1, j 1, u);
}
/**
* 贝塞尔曲线递归算法, 本方法计算 Y 轴坐标值
* @param i 贝塞尔曲线阶数
* @param j 贝塞尔曲线控制点
* @param u 比例 / 时间 , 取值范围 0.0 ~ 1.0
* @return
*/
private float BezierY(int i, int j, float u) {
if (i == 1) {
// 递归退出条件 : 贝塞尔曲线阶数 降为一阶
return (1 - u) * mControlPoints.get(j).y u * mControlPoints.get(j 1).y;
}
return (1 - u) * BezierY(i - 1, j, u) u * BezierY(i - 1, j 1, u);
}