YYPOST群发软件 发表于 2026-4-7 08:26:05

HID贝塞尔曲线运动控制器

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(` 初始化完成`);
      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);
*/


页: [1]
查看完整版本: HID贝塞尔曲线运动控制器