随机数生成函数
function random(a, b) {
return rand.randNumber(a, b);
}
/**
* @param time_ms {number} 执行时间 ms 例如 3000
* @param t {number} 间隔系数 0-1 间, 越小线条线条越圆润,计算量越大, 例如 0.005
* @param pt {number[][]} 控制点坐标的二维数组 例如 [[137,169],[140,283]]
*/
function bezier(time_ms, t, pt) {
var gesture1 = new path(); // 创建一个手势对象
gesture1.setStarTime(10); // 开始前延时
var fps = 1 / t;
for (let i = 0; i <= fps; i++) {
let copyArr = Array.from(pt, row => row.slice()); // 拷贝一份 js的数组是引用传递
var xy = calculateBezier(i * t, copyArr);
gesture1.addPoint(xy[0], xy[1]);
}
gesture1.setDurTime(time_ms); // 完成时间
auto.dispatchGesture([gesture1]); // 执行手势操作
}
/**
* @param t {number} 0 ~ 1的时间
* @param point2Fs {number[][]} 贝塞尔点集合
* @return {number[]} 返回当前时间下的贝塞尔点
*/
function calculateBezier(t, point2Fs) {
let len = point2Fs.length;
for (let i = len - 1; i > 0; i--) {
for (let j = 0; j < i; j++) {
point2Fs[j][0] = point2Fs[j][0] + (point2Fs[j + 1][0] - point2Fs[j][0]) * t;
point2Fs[j][1] = point2Fs[j][1] + (point2Fs[j + 1][1] - point2Fs[j][1]) * t;
}
}
return [parseInt(point2Fs[0][0]), parseInt(point2Fs[0][1])];
}
// 控制点
var CtrlPt1 = [
[167, 625], // 起点1
[200, 200],
[500, 500],
[300, 100]
];
var CtrlPt2 = [
[309, 833], // 起点2
[500, 700],
[600, 600],
[500, 300]
];
var CtrlPt3 = [
[151, 892], // 起点3
[300, 880], // 引入Y坐标的小变化
[450, 895], // 引入Y坐标的小变化
[600, 885] // 引入Y坐标的小变化
];
// 执行贝塞尔手势
bezier(4000, 0.005, CtrlPt1);
bezier(4000, 0.005, CtrlPt2);
bezier(4000, 0.005, CtrlPt3);
bezier(time_ms, t, pt)
函数这个函数用于生成并执行一个贝塞尔曲线手势。具体参数解释如下:
time_ms
:
bezier(4000, 0.005, CtrlPt1);
表示整个手势将在4000毫秒(4秒)内完成。t
:
t
的取值范围是0到1之间。t
值意味着计算的间隔更小,生成的曲线更圆润,但计算量也会相应增加。较大的 t
值则表示计算间隔更大,曲线可能会显得更折线化,计算量较少。bezier(4000, 0.005, CtrlPt1);
中的 t
为0.005,表示每0.005的时间单位计算一次贝塞尔曲线上的点。pt
:
pt
是一个二维数组,其中每个子数组包含两个数字,分别表示控制点的X坐标和Y坐标。CtrlPt1
定义了起点 [167, 625]
,两个控制点 [200, 200]
和 [500, 500]
,以及终点 [300, 100]
。CtrlPt2
定义了起点 [309, 833]
,两个控制点 [500, 700]
和 [600, 600]
,以及终点 [500, 300]
。CtrlPt3
定义了起点 [151, 892]
,两个控制点 [300, 880]
和 [450, 895]
,以及终点 [600, 885]
。calculateBezier(t, point2Fs)
函数这个函数用于计算贝塞尔曲线在某个时间点 t
上的坐标。具体参数解释如下:
t
:
t=0
对应曲线的起点,t=1
对应曲线的终点。t
时刻的曲线坐标。point2Fs
:
贝塞尔曲线的计算通常使用递归的插值方法。在 calculateBezier
函数中,具体步骤如下:
拷贝控制点数组:
point2Fs
。递归插值计算:
point2Fs[j][0] = point2Fs[j][0] + (point2Fs[j + 1][0] - point2Fs[j][0]) * t;
t
是当前时间参数,point2Fs[j][0]
和 point2Fs[j + 1][0]
是相邻控制点的X坐标。point2Fs[j][1] = point2Fs[j][1] + (point2Fs[j + 1][1] - point2Fs[j][1]) * t;
返回结果:
point2Fs[0]
将包含贝塞尔曲线在 t
时间点的坐标。[parseInt(point2Fs[0][0]), parseInt(point2Fs[0][1])]
,其中 parseInt
用于将坐标转换为整数。在 bezier
函数中,通过循环调用 calculateBezier
函数,生成从起点到终点的一系列点,并将这些点添加到 gesture1
对象中,最后通过 auto.dispatchGesture([gesture1]);
执行这个手势操作。
欢迎光临 B2B网络软件 (http://bbs.niubt.cn/) | Powered by Discuz! X3.2 |