贝塞尔曲线上控制点坐标分别为:P0(3,8),P1(2,3),P2(2,7),想要返回 10 个在贝塞尔曲线上的点
javascript代码如下:(从项目copy的代码,仅仅针对二维坐标dimersion = 2)
1 /**
2 * @param poss 贝塞尔曲线控制点坐标
3 * @param precision 精度,需要计算的该条贝塞尔曲线上的点的数目
4 * @return 该条贝塞尔曲线上的点(二维坐标)
5 */
6 function bezierCalculate(poss:Array<Point>, precision:number) {
7
8 //维度,坐标轴数(二维坐标,三维坐标...)
9 let dimersion = 2;
10
11 //贝塞尔曲线控制点数(阶数)
12 let number = poss.length;
13
14 //控制点数不小于 2 ,至少为二维坐标系
15 if (number < 2 || dimersion < 2)
16 return null;
17
18 let result = new Array();
19
20 //计算杨辉三角
21 let mi = new Array();
22 mi[0] = mi[1] = 1;
23 for (let i = 3; i <= number; i++) {
24
25 let t = new Array();
26 for (let j = 0; j < i - 1; j++) {
27 t[j] = mi[j];
28 }
29
30 mi[0] = mi[i - 1] = 1;
31 for (let j = 0; j < i - 2; j++) {
32 mi[j + 1] = t[j] + t[j + 1];
33 }
34 }
35
36 //计算坐标点
37 for (let i = 0; i < precision; i++) {
38 let t = i / precision;
39 let p = new Point(0, 0);
40 result.push(p);
41 for (let j = 0; j < dimersion; j++) {
42 let temp = 0.0;
43 for (let k = 0; k < number; k++) {
44 temp += Math.pow(1 - t, number - k - 1) * (j == 0 ? poss[k].x : poss[k].y) * Math.pow(t, k) * mi[k];
45 }
46 j == 0 ? p.x = temp : p.y = temp;
47 }
48 p.x = this.toDecimal(p.x);
49 p.y = this.toDecimal(p.y);
50 }
51
52 return result;
53 }
java代码:
/**
* @param poss 贝塞尔曲线控制点坐标
* @param precision 精度,需要计算的该条贝塞尔曲线上的点的数目
* @return 该条贝塞尔曲线上的点(二维坐标)
*/
public float[][] calculate(float[][] poss, int precision) {
//维度,坐标轴数(二维坐标,三维坐标...)
int dimersion = poss[0].length;
//贝塞尔曲线控制点数(阶数)
int number = poss.length;
//控制点数不小于 2 ,至少为二维坐标系
if (number < 2 || dimersion < 2)
return null;
float[][] result = new float[precision][dimersion];
//计算杨辉三角
int[] mi = new int[number];
mi[0] = mi[1] = 1;
for (int i = 3; i <= number; i++) {
int[] t = new int[i - 1];
for (int j = 0; j < t.length; j++) {
t[j] = mi[j];
}
mi[0] = mi[i - 1] = 1;
for (int j = 0; j < i - 2; j++) {
mi[j + 1] = t[j] + t[j + 1];
}
}
//计算坐标点
for (int i = 0; i < precision; i++) {
float t = (float) i / precision;
for (int j = 0; j < dimersion; j++) {
float temp = 0.0f;
for (int k = 0; k < number; k++) {
temp += Math.pow(1 - t, number - k - 1) * poss[k][j] * Math.pow(t, k) * mi[k];
}
result[i][j] = temp;
}
}
return result;
}