B2B网络软件

标题: 如何在触摸屏上生成平滑的贝塞尔曲线手势 [打印本页]

作者: YYPOST群发软件    时间: 7 小时前
标题: 如何在触摸屏上生成平滑的贝塞尔曲线手势
 随机数生成函数
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) 函数

如何在触摸屏上生成平滑的贝塞尔曲线手势 B2B网络软件 如何在触摸屏上生成平滑的贝塞尔曲线手势 B2B网络软件 如何在触摸屏上生成平滑的贝塞尔曲线手势 B2B网络软件

这个函数用于生成并执行一个贝塞尔曲线手势。具体参数解释如下:

  1. time_ms

  2. t

  3. pt

calculateBezier(t, point2Fs) 函数

这个函数用于计算贝塞尔曲线在某个时间点 t 上的坐标。具体参数解释如下:

  1. t

  2. point2Fs

计算贝塞尔曲线的详细过程

贝塞尔曲线的计算通常使用递归的插值方法。在 calculateBezier 函数中,具体步骤如下:

  1. 拷贝控制点数组

  2. 递归插值计算

  3. 返回结果

执行贝塞尔手势

在 bezier 函数中,通过循环调用 calculateBezier 函数,生成从起点到终点的一系列点,并将这些点添加到 gesture1 对象中,最后通过 auto.dispatchGesture([gesture1]); 执行这个手势操作。






欢迎光临 B2B网络软件 (http://bbs.niubt.cn/) Powered by Discuz! X3.2