如何将度数值更改为实际的x / y位置变化?

时间:2015-06-18 09:40:41

标签: javascript canvas radians

我在html画布上绘制一个圆圈,圆圈表示一个" ship"。

我有" Ship"的当前位置(x,y)。对象并随机确定度数(0到360)和金额值。 然后,我想根据程度和数量改变船舶的当前位置。

即。目前船舶在100/100(在画布上)。 我确定度数为30,数量为50。

现在我想基于0度表示"直线上升"并且180度将指示直线向下,而50度指示50个像素的移动到确定的方向。

我知道它与Radians有关,但遗憾的是我无法进一步解决它。

var ship = {
  x: 100,
  y: 100
}

var movement = {
  degrees: 30,
  amount: 50
}

2 个答案:

答案 0 :(得分:2)

是的,JavaScript中的所有角度都是弧度。此外,画布上下文向右偏0°,因此如果您希望0°直线上升,则需要从所有角度减去90°:

var angle = (movement.degrees - 90) / 180 * Math.PI;  // compensate angle -90°, conv. to rad
ship.x += movement.amount * Math.cos(angle);          // move ship
ship.y += movement.amount * Math.sin(angle);

var movement = {
  degrees: 30,
  amount: 50
}

var ctx = document.querySelector("canvas").getContext("2d");

(function loop() {
  ctx.clearRect(0, 0, 300, 150);

  var ship = {  // reset ship position for demo
    x: 100,
    y: 90
  }

  ctx.strokeRect(ship.x - 2, ship.y - 2, 4, 4);
  ctx.fillText("From", ship.x + 5, ship.y);

  var angle = (movement.degrees - 90) / 180 * Math.PI; // compensate angle -90°, conv. to rad
  ship.x += movement.amount * Math.cos(angle); // move ship
  ship.y += movement.amount * Math.sin(angle);

  ctx.strokeRect(ship.x - 2, ship.y - 2, 4, 4);
  ctx.fillText(movement.degrees + "°", ship.x + 5, ship.y);
  
  movement.degrees++;
  movement.degrees = movement.degrees % 360;
  requestAnimationFrame(loop);
})();
<canvas></canvas>

答案 1 :(得分:1)

你是对的。您必须将度数转换为弧度(1 degree = PI/180),然后计算适当的正弦和余弦。

var angle = degrees * Math.PI / 180;
var dx = Math.cos(angle) * amount;
var dy = Math.sin(angle) * amount;
x += dx;
y += dy;