我看起来既高又低,但似乎没有什么比我正在做的更合适。我需要计算子弹轨迹的x和y坐标,然后在Chart.js上绘制它们。
从(0,5)发射的子弹将击中目标(250,5)。问题在于在两者之间的轨迹上正确绘制图形(x是码,y是英尺)。
我可以在不击中目标的情况下成功计算子弹和子弹的轨迹,但我无法确定发射角,以便子弹在x距离处击中目标。
这主要是我计算的地方:https://en.wikipedia.org/wiki/Trajectory_of_a_projectile
我的应用看起来像这样:
这是我到目前为止所拥有的:
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();
}
我错过了什么?
编辑:澄清问题并添加了图片
答案 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)