如何沿对角线和锯齿形移动对象
How to move an object diagonally and in zigzag?
我创建了一个算法来对角线移动粒子,它使用角度工作得很好。基本上,这就是我所做的:
this.x += this.speed * Math.cos(this.angle * Math.PI / 180);
this.y += this.speed * Math.sin(this.angle * Math.PI / 180);
this.draw();
如何将其与锯齿形机芯相结合?
我建议计算与正常路径或amplitude
的横向偏差,由下式给出
// 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
是"之字形"三角波形态的周期。
给定振幅和前一个位置,我们现在可以通过按照原始代码的描述向前移动,然后将横向偏差添加到我们的位置来轻松计算下一个位置:
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>
假设您正在向this.angle
方向移动,并且您希望在该方向上曲折地从该方向左右移动±45°。 您需要做的就是在计算新仓位时有一个像 var zigzag = 45;
这样的变量,并向this.angle
添加zigzag
。 要使其呈锯齿形,您需要像这样经常否定它zigzag *= -1;
. 如果要停止锯齿形,请设置为 zigzag = 0;
。
诀窍是知道何时在 ±45° 之间交替。 也许您可以对开关进行定时,并保留对上次使用 Date.now();
切换时间的引用。 您可以检查当前时间和记录时间之间的差异,然后在超过一定毫秒数后否定zigzag
。 只要记得记录上次开关的新时间。 您还可以跟踪行进距离并使用相同的方法,无论哪种方法对您有用。
相关文章:
- 在javascript中移动对象内部的元素
- 使用Keydown事件移动对象
- 用鼠标在threejs场景中移动对象
- 在画布上移动对象
- HTML5画布距离和移动对象
- Javascript 无法访问 HTML(左右移动对象)
- 如何在三.js中向前移动对象
- 如何使用文本输入在HTML5画布中移动对象
- 在 HTML5 画布中沿路径旋转移动对象
- 从左到右移动对象
- 在 threejs 中沿路径或样条移动对象
- 多个移动对象,每个对象附加了文本
- 如何沿多边形移动对象
- 在矩形中移动对象
- JavaScript / ThreeJS - 围绕中心Y轴(在3D空间中)在圆圈中移动对象的方程式
- 织物.js - 在不按住鼠标按钮的情况下移动对象
- 三个 JS - 如何缩放移动对象
- 通过单击另一个对象来移动对象
- 在浏览器中移动对象
- 在画布上移动对象