c# - 计算从具有不同高度的 (0,0) 以外的位置击中坐标 (x,y) 所需的角度

标签 c# xna physics trigonometry

我正在尝试计算发射弹丸以击中特定坐标所需的角度。

我的弹丸位于随机坐标,我的目标坐标位于静态坐标。

我最终在维基百科上遇到了以下等式,用于计算从 (0,0) 到 (x,y) 处的坐标所需的角度:

我已经做了一些尝试来理解这个公式和其他公式,并尝试了以下实现(我使用的是 C# 和 XNA)。

double y = source.Y - target.Y;
double x = Vector2.Distance(source, target);
double v = 1440; //velocity
double g = 25; //gravity
double sqrt = (v*v*v*v) - (g*(g*(x*x) + 2*y*(v*v)));
sqrt = Math.Sqrt(sqrt);
double angleInRadians = Math.Atan(((v*v) + sqrt)/(g*x));

我还尝试了以下操作,这导致了一个相同的角度,其中 v 和 g 的值保持不变。

double targetX = target.X - source.X;
double targetY = -(target.Y - source.Y);
double r1 = Math.Sqrt((v*v*v*v) - g*(g*(target.X*target.X) + ((2*target.Y)*(v*v))));
double a1 = ((v*v) + r1)/(g*target.X);
angleInRadians = -Math.Atan(a1);
if (targetX < 0)
{
    angleInRadians -= 180/180*Math.PI;
}

我的猜想是,即使在我(假设的)尝试将源坐标归零的过程中,我仍然没有正确地对具有非 (0,0) 源和不同高程的坐标执行计算。

下面是一张描绘我的坐标系的图像。这是 XNA 的默认值。

最佳答案

感谢评论中的帮助,找到这个角度的解决方案最终需要将位置转换为基于 (0,0) 的系统。对于寻找相同场景的任何人,最终的工作解决方案是:

double x = -(source.x - target.x);
double y = (source.y - target.y);
double v = 1440; //m/s
double g = 25; //m/s
double sqrt = (v*v*v*v) - (g*(g*(x*x) + 2*y*(v*v)));
sqrt = Math.Sqrt(sqrt);
angleInRadians = Math.Atan(((v*v) + sqrt)/(g*x));

然后要将弧度转换为适用于 XNA 的矢量,请执行以下转换:

Vector2 angleVector = new Vector2(-(float)Math.Cos(angleInRadians), (float)Math.Sin(angleInRadians));

关于c# - 计算从具有不同高度的 (0,0) 以外的位置击中坐标 (x,y) 所需的角度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18047912/

相关文章:

C# XNA 模拟重力

c# - Xml 序列化 - 隐藏空值

c# - 如何在 dataGrid 中将 XML 中的数据排序为数字

c# - XNA Monogame 有效绘制原语

c# - 将频率转换为-1..1浮点

java - 与圆的弹性碰撞

C#:是否可以在菜单项中获取 DropDownItem 的索引?

c# - 将数据库查询数据显示为表格

xna - XNA 和 Windows 8 之间的兼容性问题

java - 有人可以解释如何实验重力值吗?