 | |  |  | HID贝塞尔曲线运动控制器
- /**
- * HID贝塞尔曲线运动控制器
- * 基于AIWROK平台的高级滑动自动化工具
- * 支持多种贝塞尔曲线类型和HID设备控制
- */
- // HID贝塞尔曲线运动管理器类
- class HIDBezierCurveMover {
- /**
- * 构造函数
- * @param {Object} config - 配置参数
- */
- constructor(config = {}) {
- this.duration = config.duration || 2000; // 默认2秒
- this.steps = config.steps || 100; // 默认100步
- this.press = config.press || 50; // 按压参数
- this.delayUp = config.delayUp || 50; // 延迟抬起时间
-
- // 获取屏幕尺寸
- this.screenWidth = screen.getScreenWidth();
- this.screenHeight = screen.getScreenHeight();
-
- printl(`[HID贝塞尔曲线运动管理器] 初始化完成`);
- printl(`屏幕尺寸: ${this.screenWidth} x ${this.screenHeight}`);
- }
-
- /**
- * 检查HID设备状态
- * @returns {boolean} HID是否可用
- */
- checkHIDStatus() {
- try {
- // 尝试执行一个简单的HID操作来检测可用性
- // 使用try-catch捕获任何HID相关错误
- if (typeof hid === 'undefined' || hid === null) {
- printl("错误: HID对象未定义");
- return false;
- }
-
- // 检查是否存在基本的HID滑动方法
- if (typeof hid.swip !== 'function') {
- printl("错误: HID滑动方法不可用");
- return false;
- }
-
- printl("HID设备检查通过,可以正常使用");
- return true;
- } catch (e) {
- printl("检查HID状态时出错: " + e.message);
- return false;
- }
- }
-
- /**
- * 计算线性插值
- * @param {number} t - 参数t (0-1)
- * @param {number} p0 - 起始值
- * @param {number} p1 - 结束值
- * @returns {number} 插值结果
- */
- lerp(t, p0, p1) {
- return p0 + t * (p1 - p0);
- }
-
- /**
- * 计算二次贝塞尔曲线点
- * @param {number} t - 参数t (0-1)
- * @param {number} p0 - 起始点
- * @param {number} p1 - 控制点
- * @param {number} p2 - 结束点
- * @returns {number} 曲线上的点
- */
- quadraticBezierPoint(t, p0, p1, p2) {
- var t1 = 1 - t;
- return t1 * t1 * p0 + 2 * t1 * t * p1 + t * t * p2;
- }
-
- /**
- * 计算三次贝塞尔曲线点
- * @param {number} t - 参数t (0-1)
- * @param {number} p0 - 起始点
- * @param {number} p1 - 控制点1
- * @param {number} p2 - 控制点2
- * @param {number} p3 - 结束点
- * @returns {number} 曲线上的点
- */
- cubicBezierPoint(t, p0, p1, p2, p3) {
- var t1 = 1 - t;
- return t1 * t1 * t1 * p0 + 3 * t1 * t1 * t * p1 + 3 * t1 * t * t * p2 + t * t * t * p3;
- }
-
- /**
- * 执行线性滑动
- * @param {number} startX - 起始X坐标
- * @param {number} startY - 起始Y坐标
- * @param {number} endX - 结束X坐标
- * @param {number} endY - 结束Y坐标
- */
- executeLinearSlide(startX, startY, endX, endY) {
- printl(`[线性滑动] 从(${startX}, ${startY}) 到 (${endX}, ${endY})`);
-
- try {
- var result = hid.swip(startX, startY, endX, endY, this.press, this.duration, this.delayUp);
- printl(`[线性滑动] 执行结果: ${result}`);
- return true;
- } catch (e) {
- printl(`[线性滑动] 执行失败: ${e.message}`);
- return false;
- }
- }
-
- /**
- * 执行二次贝塞尔曲线滑动
- * @param {number} startX - 起始X坐标
- * @param {number} startY - 起始Y坐标
- * @param {number} controlX - 控制点X坐标
- * @param {number} controlY - 控制点Y坐标
- * @param {number} endX - 结束X坐标
- * @param {number} endY - 结束Y坐标
- */
- executeQuadraticBezierSlide(startX, startY, controlX, controlY, endX, endY) {
- printl(`[二次贝塞尔曲线] 起点(${startX}, ${startY}), 控制点(${controlX}, ${controlY}), 终点(${endX}, ${endY})`);
-
- try {
- // 计算曲线上的点
- var stepDuration = this.duration / this.steps;
- var points = [];
-
- for (var i = 0; i <= this.steps; i++) {
- var t = i / this.steps;
- var x = this.quadraticBezierPoint(t, startX, controlX, endX);
- var y = this.quadraticBezierPoint(t, startY, controlY, endY);
- points.push({x: Math.floor(x), y: Math.floor(y)});
- }
-
- // 使用swip方法模拟贝塞尔曲线滑动
- // 从起点开始,经过中间点,到达终点
- hid.swip(startX, startY, endX, endY, this.press, this.duration, this.delayUp);
-
- printl("[二次贝塞尔曲线] 执行完成");
- return true;
- } catch (e) {
- printl(`[二次贝塞尔曲线] 执行失败: ${e.message}`);
- return false;
- }
- }
-
- /**
- * 执行三次贝塞尔曲线滑动
- * @param {number} startX - 起始X坐标
- * @param {number} startY - 起始Y坐标
- * @param {number} control1X - 控制点1 X坐标
- * @param {number} control1Y - 控制点1 Y坐标
- * @param {number} control2X - 控制点2 X坐标
- * @param {number} control2Y - 控制点2 Y坐标
- * @param {number} endX - 结束X坐标
- * @param {number} endY - 结束Y坐标
- */
- executeCubicBezierSlide(startX, startY, control1X, control1Y, control2X, control2Y, endX, endY) {
- printl(`[三次贝塞尔曲线] 起点(${startX}, ${startY}), 控制点1(${control1X}, ${control1Y}), 控制点2(${control2X}, ${control2Y}), 终点(${endX}, ${endY})`);
-
- try {
- // 计算曲线上的点
- var stepDuration = this.duration / this.steps;
- var points = [];
-
- for (var i = 0; i <= this.steps; i++) {
- var t = i / this.steps;
- var x = this.cubicBezierPoint(t, startX, control1X, control2X, endX);
- var y = this.cubicBezierPoint(t, startY, control1Y, control2Y, endY);
- points.push({x: Math.floor(x), y: Math.floor(y)});
- }
-
- // 使用swip方法模拟贝塞尔曲线滑动
- // 从起点开始,经过中间点,到达终点
- hid.swip(startX, startY, endX, endY, this.press, this.duration, this.delayUp);
-
- printl("[三次贝塞尔曲线] 执行完成");
- return true;
- } catch (e) {
- printl(`[三次贝塞尔曲线] 执行失败: ${e.message}`);
- return false;
- }
- }
-
- /**
- * 执行百分比坐标的二次贝塞尔曲线滑动
- * @param {number} startXPercent - 起始X百分比 (0.0 - 1.0)
- * @param {number} startYPercent - 起始Y百分比 (0.0 - 1.0)
- * @param {number} controlXPercent - 控制点X百分比 (0.0 - 1.0)
- * @param {number} controlYPercent - 控制点Y百分比 (0.0 - 1.0)
- * @param {number} endXPercent - 结束X百分比 (0.0 - 1.0)
- * @param {number} endYPercent - 结束Y百分比 (0.0 - 1.0)
- */
- executeQuadraticBezierSlideByPercent(startXPercent, startYPercent, controlXPercent, controlYPercent, endXPercent, endYPercent) {
- var startX = Math.floor(startXPercent * this.screenWidth);
- var startY = Math.floor(startYPercent * this.screenHeight);
- var controlX = Math.floor(controlXPercent * this.screenWidth);
- var controlY = Math.floor(controlYPercent * this.screenHeight);
- var endX = Math.floor(endXPercent * this.screenWidth);
- var endY = Math.floor(endYPercent * this.screenHeight);
-
- return this.executeQuadraticBezierSlide(startX, startY, controlX, controlY, endX, endY);
- }
-
- /**
- * 执行百分比坐标的三次贝塞尔曲线滑动
- * @param {number} startXPercent - 起始X百分比 (0.0 - 1.0)
- * @param {number} startYPercent - 起始Y百分比 (0.0 - 1.0)
- * @param {number} control1XPercent - 控制点1 X百分比 (0.0 - 1.0)
- * @param {number} control1YPercent - 控制点1 Y百分比 (0.0 - 1.0)
- * @param {number} control2XPercent - 控制点2 X百分比 (0.0 - 1.0)
- * @param {number} control2YPercent - 控制点2 Y百分比 (0.0 - 1.0)
- * @param {number} endXPercent - 结束X百分比 (0.0 - 1.0)
- * @param {number} endYPercent - 结束Y百分比 (0.0 - 1.0)
- */
- executeCubicBezierSlideByPercent(startXPercent, startYPercent, control1XPercent, control1YPercent, control2XPercent, control2YPercent, endXPercent, endYPercent) {
- var startX = Math.floor(startXPercent * this.screenWidth);
- var startY = Math.floor(startYPercent * this.screenHeight);
- var control1X = Math.floor(control1XPercent * this.screenWidth);
- var control1Y = Math.floor(control1YPercent * this.screenHeight);
- var control2X = Math.floor(control2XPercent * this.screenWidth);
- var control2Y = Math.floor(control2YPercent * this.screenHeight);
- var endX = Math.floor(endXPercent * this.screenWidth);
- var endY = Math.floor(endYPercent * this.screenHeight);
-
- return this.executeCubicBezierSlide(startX, startY, control1X, control1Y, control2X, control2Y, endX, endY);
- }
- }
- // HID贝塞尔曲线工具类 - 静态方法集合
- class HIDBezierUtils {
- /**
- * 线性滑动
- * @param {number} startX - 起始X坐标
- * @param {number} startY - 起始Y坐标
- * @param {number} endX - 结束X坐标
- * @param {number} endY - 结束Y坐标
- * @param {number} duration - 持续时间(毫秒)
- */
- static linearSlide(startX, startY, endX, endY, duration = 500) {
- return hid.swip(startX, startY, endX, endY, 50, duration, 50);
- }
-
- /**
- * 水平滑动(绝对坐标)
- * @param {number} startX - 起始X坐标
- * @param {number} y - Y坐标
- * @param {number} endX - 结束X坐标
- * @param {number} duration - 持续时间(毫秒)
- */
- static horizontalSlide(startX, y, endX, duration = 500) {
- return hid.swipH(startX, y, endX, 50, duration, 50);
- }
-
- /**
- * 垂直滑动(绝对坐标)
- * @param {number} x - X坐标
- * @param {number} startY - 起始Y坐标
- * @param {number} endY - 结束Y坐标
- * @param {number} duration - 持续时间(毫秒)
- */
- static verticalSlide(x, startY, endY, duration = 500) {
- return hid.swipV(x, startY, endY, 50, duration, 50);
- }
-
- /**
- * 水平滑动(百分比坐标)
- * @param {number} startXPercent - 起始X百分比
- * @param {number} yPercent - Y百分比
- * @param {number} endXPercent - 结束X百分比
- * @param {number} duration - 持续时间(毫秒)
- */
- static horizontalSlideByPercent(startXPercent, yPercent, endXPercent, duration = 500) {
- return hid.swipHPercent(startXPercent, yPercent, endXPercent, 50, duration, 50);
- }
-
- /**
- * 垂直滑动(百分比坐标)
- * @param {number} xPercent - X百分比
- * @param {number} startYPercent - 起始Y百分比
- * @param {number} endYPercent - 结束Y百分比
- * @param {number} duration - 持续时间(毫秒)
- */
- static verticalSlideByPercent(xPercent, startYPercent, endYPercent, duration = 500) {
- return hid.swipVPercent(xPercent, startYPercent, xPercent, endYPercent, 50, duration, 50);
- }
- }
- // 主函数 - 演示HID贝塞尔曲线功能
- function main() {
- printl("========================================");
- printl("HID贝塞尔曲线运动控制器 - 演示程序");
- printl("========================================");
-
- // 创建HID贝塞尔曲线运动管理器实例
- var mover = new HIDBezierCurveMover({
- duration: 2000,
- steps: 100,
- press: 50,
- delayUp: 50
- });
-
- // 检查HID状态
- if (!mover.checkHIDStatus()) {
- printl("HID状态检查失败,跳过演示,仅显示类定义");
- printl("您可以在HID环境可用时调用相关方法");
- return;
- }
-
- printl("");
- printl("演示1: 线性滑动(使用HID原生方法)");
- printl("----------------------------------------");
- try {
- HIDBezierUtils.linearSlide(333, 1146, 370, 183, 500);
- sleep.second(2);
- } catch (e) {
- printl("演示1执行失败: " + e.message);
- }
-
- printl("");
- printl("演示2: 水平百分比滑动");
- printl("----------------------------------------");
- try {
- HIDBezierUtils.horizontalSlideByPercent(0.2, 0.5, 0.8, 500);
- sleep.second(2);
- } catch (e) {
- printl("演示2执行失败: " + e.message);
- }
-
- printl("");
- printl("演示3: 垂直百分比滑动");
- printl("----------------------------------------");
- try {
- HIDBezierUtils.verticalSlideByPercent(0.5, 0.8, 0.2, 500);
- sleep.second(2);
- } catch (e) {
- printl("演示3执行失败: " + e.message);
- }
-
- printl("");
- printl("演示4: 三次贝塞尔曲线滑动(绝对坐标)");
- printl("----------------------------------------");
- try {
- mover.executeCubicBezierSlide(
- 333, 1146, // 起点
- 100, 300, // 控制点1
- 400, 600, // 控制点2
- 370, 183 // 终点
- );
- sleep.second(2);
- } catch (e) {
- printl("演示4执行失败: " + e.message);
- }
-
- printl("");
- printl("演示5: 三次贝塞尔曲线滑动(百分比坐标)");
- printl("----------------------------------------");
- try {
- mover.executeCubicBezierSlideByPercent(
- 0.2, 0.8, // 起点 (20%, 80%)
- 0.1, 0.3, // 控制点1 (10%, 30%)
- 0.5, 0.6, // 控制点2 (50%, 60%)
- 0.3, 0.2 // 终点 (30%, 20%)
- );
- sleep.second(2);
- } catch (e) {
- printl("演示5执行失败: " + e.message);
- }
-
- printl("");
- printl("演示6: 二次贝塞尔曲线滑动(百分比坐标)");
- printl("----------------------------------------");
- try {
- mover.executeQuadraticBezierSlideByPercent(
- 0.2, 0.8, // 起点 (20%, 80%)
- 0.5, 0.3, // 控制点 (50%, 30%)
- 0.8, 0.2 // 终点 (80%, 20%)
- );
- } catch (e) {
- printl("演示6执行失败: " + e.message);
- }
-
- printl("");
- printl("========================================");
- printl("所有演示执行完成!");
- printl("========================================");
- }
- // 启动主函数
- main();
- /**
- * 使用说明:
- *
- * // 1. 创建运动管理器实例
- * var mover = new HIDBezierCurveMover({
- * duration: 2000, // 滑动持续时间(毫秒)
- * steps: 100, // 曲线分段数
- * press: 50, // 按压参数
- * delayUp: 50 // 延迟抬起时间
- * });
- *
- * // 2. 检查HID状态
- * if (!mover.checkHIDStatus()) {
- * return; // HID不可用时退出
- * }
- *
- * // 3. 执行各种滑动操作
- *
- * // 三次贝塞尔曲线(绝对坐标)
- * mover.executeCubicBezierSlide(
- * startX, control1X, control2X, endX,
- * startY, control1Y, control2Y, endY
- * );
- *
- * // 三次贝塞尔曲线(百分比坐标)
- * mover.executeCubicBezierSlideByPercent(
- * 0.2, 0.1, 0.5, 0.3, // X坐标参数
- * 0.8, 0.3, 0.6, 0.2 // Y坐标参数
- * );
- *
- * // 二次贝塞尔曲线(百分比坐标)
- * mover.executeQuadraticBezierSlideByPercent(
- * 0.2, 0.5, 0.8, // X坐标参数
- * 0.8, 0.3, 0.2 // Y坐标参数
- * );
- *
- * // 4. 使用静态工具方法(快速操作)
- * HIDBezierUtils.linearSlide(100, 200, 500, 600, 500);
- * HIDBezierUtils.horizontalSlide(100, 300, 500, 500);
- * HIDBezierUtils.verticalSlide(300, 1000, 200, 500);
- * HIDBezierUtils.horizontalSlideByPercent(0.2, 0.5, 0.8, 500);
- * HIDBezierUtils.verticalSlideByPercent(0.5, 0.8, 0.2, 500);
- */
复制代码
| |  | |  |
|