计算子弹轨迹的x和y坐标 - Chart.js

时间:2017-09-05 18:05:13

标签: javascript angular chart.js

我看起来既高又低,但似乎没有什么比我正在做的更合适。我需要计算子弹轨迹的x和y坐标,然后在Chart.js上绘制它们。

从(0,5)发射的子弹将击中目标(250,5)。问题在于在两者之间的轨迹上正确绘制图形(x是码,y是英尺)。

我可以在不击中目标的情况下成功计算子弹和子弹的轨迹,但我无法确定发射角,以便子弹在x距离处击中目标。

这主要是我计算的地方:https://en.wikipedia.org/wiki/Trajectory_of_a_projectile

我的应用看起来像这样:

My apps graph

这是我到目前为止所拥有的:

calcTrajectory() {

// get target distance - passed in

// get launch angle to hit target at that distance
let x = this.distance;
let y = this.height;
let g = 10.733; // gravity in yds
let v = this.velocity / 3; // velocity in yds
let angle = Math.atan(
  Math.pow(v, 2) + Math.sqrt(
    Math.pow(v, 4) - g * ((g * x * x) + (2 * y * v * v)
    ))
  /
  (g * x)
);

// graph x y coords based on target distance, launch angle, and bullet drop
for (let i = 0; i < 10; i++) {
  let time = (i * 100) / v;
  let bulletY: number = Math.sin(angle - (Math.PI / 2)) * v;
  let dropVal = ((10.733 / 2) * Math.pow(time, 2)) * 3;

  console.log('Bullet Y:', bulletY);

  this.myChart.data.datasets.forEach((dataset) => {
    dataset.data.push({
      x: (i * 100),
      y: parseInt(this.height) + bulletY - dropVal
    });
  });

  // update chart
  this.myChart.update();
}

我错过了什么?

编辑:澄清问题并添加了图片

1 个答案:

答案 0 :(得分:2)

我必须删除所有的Angular / Typescript内容,但您应该能够运行以下代码并将输出粘贴到图形程序中并进行验证。我正在做的是计算行进距离输入所需的角度,然后计算初始速度的x和y向量。然后你可以将它们乘以一个时间步长来获得你可以绘制的点数。如果您想要更细粒度的点,只需增加步长变量。

const calcTrajectory = (distance, height, velocity)=> {

  // get target distance - passed in

  // get launch angle to hit target at that distance
  let x = distance;
  let y = height;
  let g = 10.733; // gravity in yds
  let v = velocity / 3; // velocity in yds
  let angle = Math.asin((x*g)/(v*v));
  let step = 100;
  let xVelocity = v * Math.cos(angle);
  let yVelocity = v * Math.sin(angle)
  // graph x y coords based on target distance, launch angle, and bullet drop

  let data = {x:[], y:[]}
  for (let i = 0; i < 100; i++) {
    let time = (i / step);
    data.x.push(time*xVelocity)
    data.y.push(time* yVelocity)
    yVelocity -= (g/step)
  }
console.log(data);
}

calcTrajectory(250, 0, 2024.43)