Õâ¶Î´úÂ붨ÒåÁËһЩÓÃÓÚÉú³ÉºÍÖ´Ðб´Èû¶ûÇúÏßÊÖÊƵĺ¯Êý¡£¾ßÌåÀ´Ëµ£¬´úÂë·ÖΪÒÔϼ¸¸ö²¿·Ö£º - Ëæ»úÊýÉú³Éº¯Êý: Õâ¸öº¯Êý random(a, b) ʹÓà rand.randNumber(a, b) À´Éú³ÉÒ»¸öÔÚ a µ½ b Ö®¼äµÄËæ»úÊý¡£²»¹ý£¬ÔÚÍêÕûµÄ´úÂëÖУ¬rand.randNumber ÐèÒªÊÇÒ»¸öÒѶ¨ÒåµÄº¯Êý»ò¿â·½·¨¡£
- ÍÖÔ²ÇúÏßµãÉú³ÉÆ÷: º¯Êý generateEllipticPoints(a, b, xStart, xEnd, step) ÓÃÓÚ¸ù¾ÝÍÖÔ²ÇúÏߵIJÎÊý a ºÍ b£¬ÔÚÖ¸¶¨µÄ x ·¶Î§ÄÚÉú³ÉһϵÁеĵ㡣ÕâЩµãµÄ x ×ø±ê´Ó xStart ¿ªÊ¼£¬Öð²½Ôö¼Ó step£¬Ö±µ½ xEnd¡£¶ÔÓÚÿ¸ö x ×ø±ê£¬¸ù¾ÝÍÖÔ²ÇúÏß·½³Ì y^2 = x^3 + ax + b ¼ÆËã³ö¶ÔÓ¦µÄ y Öµ£¬²¢½«ÕâЩµã´æ´¢ÔÚÊý×é points ÖС£×¢Ò⣬ÕâÀïµÄ y ÖµÊÇͨ¹ýȡƽ·½¸ùµÃµ½µÄÕýÖµ£¬Êµ¼ÊÉÏÍÖÔ²ÇúÏßÉϵÄÿ¸ö x ×ø±ê¶ÔÓ¦Á½¸ö y Öµ£¨Õý¸º£©£¬µ«Õâ¶Î´úÂëÖ»Ìí¼ÓÁËÕýÖµ¡£
- ½«ÍÖÔ²ÇúÏßµãת»»ÎªÆÁÄ»×ø±ê: º¯Êý mapToScreen(points, screenWidth, screenHeight, scale) ½«Éú³ÉµÄÍÖÔ²ÇúÏßÉϵĵãת»»ÎªÊµ¼ÊÆÁÄ»ÉϵÄ×ø±ê¡£ÕâÀï¼ÙÉèÆÁÄ»ÖÐÐĵãÊÇ (screenWidth / 2, screenHeight / 2)£¬È»ºóͨ¹ý scale ²ÎÊýÀ´µ÷ÕûµãµÄλÖã¬Ê¹ÆäÊÊÓ¦ÆÁÄ»´óС¡£YÖáµÄ·½ÏòÔÚÆÁÄ»×ø±êϵÖÐÊÇÏà·´µÄ£¬Òò´Ë y ×ø±êÐèÒª·´×ª¡£
- ±´Èû¶ûÇúÏß¼ÆËã: º¯Êý calculateBezier(t, point2Fs) ʵÏÖÁ˱´Èû¶ûÇúÏߵļÆËã¡£t ÊÇÒ»¸öʱ¼ä²ÎÊý£¬·¶Î§´Ó 0 µ½ 1¡£point2Fs ÊÇ¿ØÖƵãÊý×飬±íʾ±´Èû¶ûÇúÏߵĹؼüµã¡£Í¨¹ýµü´úºÍ²åÖµ¼ÆË㣬Õâ¸öº¯Êý»á¸ù¾Ý t µÄÖµ¼ÆËã³öÇúÏßÉϵÄÒ»¸öµã£¬²¢·µ»ØÕâ¸öµãµÄ×ø±ê¡£
- Ö´Ðб´Èû¶ûÊÖÊÆ: º¯Êý bezier(time_ms, t, pt) ¸ºÔð´´½¨ºÍÖ´ÐÐÒ»¸ö±´Èû¶ûÇúÏßÊÖÊÆ¡£Ê×ÏÈ´´½¨Ò»¸öÊÖÊƶÔÏó gesture1£¬²¢ÉèÖÿªÊ¼Ê±µÄÑÓʱ¡£È»ºó¸ù¾Ýʱ¼ä²ÎÊý t ºÍ¿ØÖƵãÊý×é pt ¼ÆËã±´Èû¶ûÇúÏßÉϵĶà¸öµã£¬²¢½«ÕâЩµãÌí¼Óµ½ÊÖÊƶÔÏóÖС£×îºó£¬ÉèÖÃÊÖÊƵÄÍê³Éʱ¼ä²¢Ö´ÐиÃÊÖÊÆ¡£
- Ö´ÐÐÊÖÊƵÄʾÀý: º¯Êý demonstrateEllipticGesture() ÊÇÒ»¸öÍêÕûµÄʾÀý£¬Õ¹Ê¾ÁËÈçºÎÉú³ÉÍÖÔ²ÇúÏßÉϵĵ㣬½«ÕâЩµãÓ³Éäµ½ÆÁÄ»×ø±ê£¬Ìí¼ÓËæ»úÈŶ¯Ê¹Æä¸ü×ÔÈ»£¬²¢Ñ¡Ôñ²¿·Öµã×÷Ϊ±´Èû¶ûÇúÏߵĹؼü¿ØÖƵ㣬×îºóÖ´ÐÐÊÖÊÆ¡£ÔÚÕâ¸öʾÀýÖУ¬ÍÖÔ²ÇúÏߵIJÎÊý a ºÍ b ±»ÉèÖÃΪ -3 ºÍ 2£¬x ·¶Î§ÊÇ´Ó -2 µ½ 2£¬²½³¤ÊÇ 0.1¡£¼ÙÉèÆÁÄ»·Ö±æÂÊΪ 1080x1920£¬Ëõ·ÅÒò×Ó scale ÉèÖÃΪ 200¡£ÊÖÊƵÄÖ´ÐÐʱ¼äÉèÖÃΪ 3000 ºÁÃ룬¼ä¸ôϵÊý t ÉèÖÃΪ 0.005¡£
Çë×¢Ò⣬´úÂëÖеÄһЩ¶ÔÏóºÍ·½·¨£¨Èç path, gesture1.setStarTime, gesture1.addPoint, gesture1.setDurTime, auto.dispatchGesture µÈ£©ÊǼÙÉè´æÔڵģ¬¿ÉÄÜÐèÒª¸ù¾Ýʵ¼ÊʹÓõĿâ»ò¿ò¼Ü½øÐе÷Õû¡£ - // Ëæ»úÊýÉú³Éº¯Êý
- function random(a, b) {
- return rand.randNumber(a, b);
- }
- /**
- * ÍÖÔ²ÇúÏßµãÉú³ÉÆ÷
- * @param {number} a - ÇúÏß²ÎÊýa
- * @param {number} b - ÇúÏß²ÎÊýb
- * @param {number} xStart - xÆðʼֵ
- * @param {number} xEnd - x½áÊøÖµ
- * @param {number} step - ²½³¤
- * @returns {Array} ¿ØÖƵãÊý×é
- */
- function generateEllipticPoints(a, b, xStart, xEnd, step) {
- var points = [];
- for (var x = xStart; x <= xEnd; x += step) {
- // ¼ÆËã y^2 = x^3 + ax + b
- var ySquared = x * x * x + a * x + b;
- if (ySquared >= 0) {
- var y = Math.sqrt(ySquared);
- // Ìí¼ÓÕýÖµµã
- points.push([x, y]);
- }
- }
- return points;
- }
- /**
- * ½«ÍÖÔ²ÇúÏßµãת»»ÎªÆÁÄ»×ø±ê
- * @param {Array} points - ÍÖÔ²ÇúÏßÉϵĵã
- * @param {number} screenWidth - ÆÁÄ»¿í¶È
- * @param {number} screenHeight - ÆÁÄ»¸ß¶È
- * @param {number} scale - Ëõ·ÅÒò×Ó
- * @returns {Array} ÆÁÄ»×ø±êµãÊý×é
- */
- function mapToScreen(points, screenWidth, screenHeight, scale) {
- var screenPoints = [];
- var centerX = screenWidth / 2;
- var centerY = screenHeight / 2;
-
- for (var i = 0; i < points.length; i++) {
- var x = centerX + points[0] * scale;
- var y = centerY - points[1] * scale; // ·´×ªYÖá·½Ïò
- screenPoints.push([Math.round(x), Math.round(y)]);
- }
- return screenPoints;
- }
- /**
- * ±´Èû¶ûÇúÏß¼ÆËã
- * @param {number} t - ʱ¼ä²ÎÊý (0-1)
- * @param {Array} point2Fs - ¿ØÖƵãÊý×é
- * @returns {Array} ¼ÆËãµÃµ½µÄµã×ø±ê
- */
- function calculateBezier(t, point2Fs) {
- var len = point2Fs.length;
- for (var i = len - 1; i > 0; i--) {
- for (var 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])];
- }
- /**
- * Ö´Ðб´Èû¶ûÊÖÊÆ
- * @param {number} time_ms - Ö´ÐÐʱ¼ä(ºÁÃë)
- * @param {number} t - ¼ä¸ôϵÊý(0-1)
- * @param {Array} pt - ¿ØÖƵãÊý×é
- */
- function bezier(time_ms, t, pt) {
- var gesture1 = new path(); // ´´½¨ÊÖÊƶÔÏó
- gesture1.setStarTime(10); // ¿ªÊ¼Ç°ÑÓʱ
-
- var fps = 1 / t;
- for (var i = 0; i <= fps; i++) {
- var copyArr = pt.map(function(row) { return row.slice(); }); // ES5¼æÈݵÄÊý×鿽±´
- var xy = calculateBezier(i * t, copyArr);
- gesture1.addPoint(xy[0], xy[1]);
- }
-
- gesture1.setDurTime(time_ms); // Íê³Éʱ¼ä
- auto.dispatchGesture([gesture1]); // Ö´ÐÐÊÖÊÆ
- }
- // ʾÀý£ºÉú³É²¢Ö´ÐÐÍÖÔ²ÇúÏßÊÖÊÆ
- function demonstrateEllipticGesture() {
- // Éú³ÉÍÖÔ²ÇúÏßµã
- var a = -3; // ÇúÏß²ÎÊý
- var b = 2; // ÇúÏß²ÎÊý
- var points = generateEllipticPoints(a, b, -2, 2, 0.1);
-
- // ½«µãÓ³Éäµ½ÆÁÄ»×ø±ê£¨¼ÙÉèÆÁÄ»·Ö±æÂÊΪ1080x1920£©
- var screenPoints = mapToScreen(points, 1080, 1920, 200);
-
- // Ìí¼ÓһЩËæ»úÈŶ¯Ê¹¹ì¼£¸ü×ÔÈ»
- var controlPoints = screenPoints.map(function(point) {
- return [
- point[0] + random(-10, 10),
- point[1] + random(-10, 10)
- ];
- });
-
- // Ñ¡Ôñ¹Ø¼ü¿ØÖƵ㣨ΪÁ˼õÉÙ¼ÆËãÁ¿£¬ÎÒÃÇֻѡÔñ²¿·Öµã£©
- var keyPoints = [];
- for (var i = 0; i < controlPoints.length; i += Math.floor(controlPoints.length / 4)) {
- keyPoints.push(controlPoints);
- }
-
- // È·±£ÖÁÉÙÓÐ4¸ö¿ØÖƵã
- while (keyPoints.length < 4) {
- keyPoints.push(controlPoints[controlPoints.length - 1]);
- }
-
- // Ö´ÐÐÊÖÊÆ
- bezier(3000, 0.005, keyPoints);
- }
- // ʹÓÃʾÀý
- try {
- printl("¿ªÊ¼Éú³ÉÍÖÔ²ÇúÏßÊÖÊÆ...");
- demonstrateEllipticGesture();
- printl("ÊÖÊÆÖ´ÐÐÍê³É");
- } catch (e) {
- printl("Ö´Ðгö´í: " + e.message);
- }
¸´ÖÆ´úÂë
Õâ¶Î´úÂ붨ÒåÁËһЩÓÃÓÚÉú³ÉºÍÖ´Ðб´Èû¶ûÇúÏßÊÖÊƵĺ¯Êý¡£¾ßÌåÀ´Ëµ£¬´úÂë·ÖΪÒÔϼ¸¸ö²¿·Ö£º - Ëæ»úÊýÉú³Éº¯Êý: Õâ¸öº¯Êý random(a, b) ʹÓà rand.randNumber(a, b) À´Éú³ÉÒ»¸öÔÚ a µ½ b Ö®¼äµÄËæ»úÊý¡£²»¹ý£¬ÔÚÍêÕûµÄ´úÂëÖУ¬rand.randNumber ÐèÒªÊÇÒ»¸öÒѶ¨ÒåµÄº¯Êý»ò¿â·½·¨¡£
- ÍÖÔ²ÇúÏßµãÉú³ÉÆ÷: º¯Êý generateEllipticPoints(a, b, xStart, xEnd, step) ÓÃÓÚ¸ù¾ÝÍÖÔ²ÇúÏߵIJÎÊý a ºÍ b£¬ÔÚÖ¸¶¨µÄ x ·¶Î§ÄÚÉú³ÉһϵÁеĵ㡣ÕâЩµãµÄ x ×ø±ê´Ó xStart ¿ªÊ¼£¬Öð²½Ôö¼Ó step£¬Ö±µ½ xEnd¡£¶ÔÓÚÿ¸ö x ×ø±ê£¬¸ù¾ÝÍÖÔ²ÇúÏß·½³Ì y^2 = x^3 + ax + b ¼ÆËã³ö¶ÔÓ¦µÄ y Öµ£¬²¢½«ÕâЩµã´æ´¢ÔÚÊý×é points ÖС£×¢Ò⣬ÕâÀïµÄ y ÖµÊÇͨ¹ýȡƽ·½¸ùµÃµ½µÄÕýÖµ£¬Êµ¼ÊÉÏÍÖÔ²ÇúÏßÉϵÄÿ¸ö x ×ø±ê¶ÔÓ¦Á½¸ö y Öµ£¨Õý¸º£©£¬µ«Õâ¶Î´úÂëÖ»Ìí¼ÓÁËÕýÖµ¡£
- ½«ÍÖÔ²ÇúÏßµãת»»ÎªÆÁÄ»×ø±ê: º¯Êý mapToScreen(points, screenWidth, screenHeight, scale) ½«Éú³ÉµÄÍÖÔ²ÇúÏßÉϵĵãת»»ÎªÊµ¼ÊÆÁÄ»ÉϵÄ×ø±ê¡£ÕâÀï¼ÙÉèÆÁÄ»ÖÐÐĵãÊÇ (screenWidth / 2, screenHeight / 2)£¬È»ºóͨ¹ý scale ²ÎÊýÀ´µ÷ÕûµãµÄλÖã¬Ê¹ÆäÊÊÓ¦ÆÁÄ»´óС¡£YÖáµÄ·½ÏòÔÚÆÁÄ»×ø±êϵÖÐÊÇÏà·´µÄ£¬Òò´Ë y ×ø±êÐèÒª·´×ª¡£
- ±´Èû¶ûÇúÏß¼ÆËã: º¯Êý calculateBezier(t, point2Fs) ʵÏÖÁ˱´Èû¶ûÇúÏߵļÆËã¡£t ÊÇÒ»¸öʱ¼ä²ÎÊý£¬·¶Î§´Ó 0 µ½ 1¡£point2Fs ÊÇ¿ØÖƵãÊý×飬±íʾ±´Èû¶ûÇúÏߵĹؼüµã¡£Í¨¹ýµü´úºÍ²åÖµ¼ÆË㣬Õâ¸öº¯Êý»á¸ù¾Ý t µÄÖµ¼ÆËã³öÇúÏßÉϵÄÒ»¸öµã£¬²¢·µ»ØÕâ¸öµãµÄ×ø±ê¡£
- Ö´Ðб´Èû¶ûÊÖÊÆ: º¯Êý bezier(time_ms, t, pt) ¸ºÔð´´½¨ºÍÖ´ÐÐÒ»¸ö±´Èû¶ûÇúÏßÊÖÊÆ¡£Ê×ÏÈ´´½¨Ò»¸öÊÖÊƶÔÏó gesture1£¬²¢ÉèÖÿªÊ¼Ê±µÄÑÓʱ¡£È»ºó¸ù¾Ýʱ¼ä²ÎÊý t ºÍ¿ØÖƵãÊý×é pt ¼ÆËã±´Èû¶ûÇúÏßÉϵĶà¸öµã£¬²¢½«ÕâЩµãÌí¼Óµ½ÊÖÊƶÔÏóÖС£×îºó£¬ÉèÖÃÊÖÊƵÄÍê³Éʱ¼ä²¢Ö´ÐиÃÊÖÊÆ¡£
- Ö´ÐÐÊÖÊƵÄʾÀý: º¯Êý demonstrateEllipticGesture() ÊÇÒ»¸öÍêÕûµÄʾÀý£¬Õ¹Ê¾ÁËÈçºÎÉú³ÉÍÖÔ²ÇúÏßÉϵĵ㣬½«ÕâЩµãÓ³Éäµ½ÆÁÄ»×ø±ê£¬Ìí¼ÓËæ»úÈŶ¯Ê¹Æä¸ü×ÔÈ»£¬²¢Ñ¡Ôñ²¿·Öµã×÷Ϊ±´Èû¶ûÇúÏߵĹؼü¿ØÖƵ㣬×îºóÖ´ÐÐÊÖÊÆ¡£ÔÚÕâ¸öʾÀýÖУ¬ÍÖÔ²ÇúÏߵIJÎÊý a ºÍ b ±»ÉèÖÃΪ -3 ºÍ 2£¬x ·¶Î§ÊÇ´Ó -2 µ½ 2£¬²½³¤ÊÇ 0.1¡£¼ÙÉèÆÁÄ»·Ö±æÂÊΪ 1080x1920£¬Ëõ·ÅÒò×Ó scale ÉèÖÃΪ 200¡£ÊÖÊƵÄÖ´ÐÐʱ¼äÉèÖÃΪ 3000 ºÁÃ룬¼ä¸ôϵÊý t ÉèÖÃΪ 0.005¡£
Çë×¢Ò⣬´úÂëÖеÄһЩ¶ÔÏóºÍ·½·¨£¨Èç path, gesture1.setStarTime, gesture1.addPoint, gesture1.setDurTime, auto.dispatchGesture µÈ£©ÊǼÙÉè´æÔڵģ¬¿ÉÄÜÐèÒª¸ù¾Ýʵ¼ÊʹÓõĿâ»ò¿ò¼Ü½øÐе÷Õû¡£
|