javascript - 如何使物体沿对 Angular 线和之字形移动?

标签 javascript html canvas html5-canvas

我创建了一种算法来对 Angular 移动粒子,并且使用 Angular 效果很好。基本上,这就是我所做的:

this.x += this.speed * Math.cos(this.angle * Math.PI / 180);
this.y += this.speed * Math.sin(this.angle * Math.PI / 180);
this.draw();

如何将其与之字形运动结合起来?

最佳答案

我建议计算与正常路径或振幅的横向偏差,由下式给出

// Triangle wave at position t with period p:
function amplitude(t, p) {
  t %= p;
  return t > p * 0.25 ? t < p * 0.75 ? p * 0.5 - t : t - p : t;
}

其中 t 将设置为行进路径的长度,p 是“之字形”三 Angular 波图案的周期。

给定幅度和之前的位置,我们现在可以通过按照原始代码所述向前移动,然后将横向偏差添加到我们的位置来轻松计算下一个位置:

  var amplitude = amplitude(distance, p) - this.amplitude(previous_distance, p);
  this.x += amplitude * Math.sin(this.angle * Math.PI/180);
  this.y -= amplitude * Math.cos(this.angle * Math.PI/180);

一个包含两个可移动对象的完整示例,一个“正常”移动,一个遵循“之字形”模式:

function Movable(x, y, speed, angle, period) {
  this.x = x;
  this.y = y;
  this.speed = speed;
  this.angle = angle;
  this.period = period;
  this.distance = 0;
}

Movable.prototype.moveDiagonal = function() {
  this.distance += this.speed;
  this.x += this.speed * Math.cos(this.angle * Math.PI / 180);
  this.y += this.speed * Math.sin(this.angle * Math.PI / 180);
}

Movable.prototype.amplitudeZigZag = function() {
  var p = this.period, d = this.distance % p;
  return d > p * 0.25 ? d < p * 0.75 ? p * 0.5 - d : d - p : d;
}

Movable.prototype.moveZigZag = function() {
  var amplitude1 = this.amplitudeZigZag();
  this.moveDiagonal();
  var amplitude2 = this.amplitudeZigZag();
  
  var amplitude = amplitude2 - amplitude1;
  this.x -= amplitude * Math.sin(this.angle * Math.PI/180);
  this.y += amplitude * Math.cos(this.angle * Math.PI/180);
}

Movable.prototype.draw = function(context) {
  context.beginPath();
  context.arc(this.x, this.y, 1, 0, 2 * Math.PI);
  context.stroke();
}

var canvas = document.getElementById("canvas");
var context = canvas.getContext("2d");

var m1 = new Movable(0, 0, 2, 0, 50);
var m2 = new Movable(0, 0, 2, 0, 50);

for (var i = 0; i < 1000; ++i) {
  m1.angle += Math.cos(i * Math.PI/180);
  m2.angle += Math.cos(i * Math.PI/180);
  m1.moveDiagonal();
  m2.moveZigZag();
  m1.draw(context);
  m2.draw(context);
}
<canvas id="canvas" width="600" height="200"></canvas>

关于javascript - 如何使物体沿对 Angular 线和之字形移动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38403239/

相关文章:

mysql - 将 Google Analytics 数据导入 MySQL 数据库的最佳方法是什么?

javascript - 存储 requestAnimationFrame

javascript - 是否可以将 Canvas 图像复制到剪贴板?

javascript - 为什么涉及 if 语句的 JavaScript 计算不起作用?

html - 一键切换两个复选框,无需js

javascript - 在 Canvas 上绘制 3 个圆圈的重叠部分

javascript - 将错误抛出到promise.catch之外

html - 如何在单列网格中 float 引导卡

javascript - 在 javascript 中制作小费计算器,用户可以在其中输入所需的小费百分比并计算按钮不起作用

javascript - 将图像从 localStorage 加载到 Canvas 只能每秒刷新一次吗?