C# 射弹模拟器 - 将速度应用于射弹物理的 X 位置
C# Projectile Simulator - Applying Speed to X Position of Projectile Physics
首先,这是代码:
decimal gravity = decimal.Parse(gforce.Text) / 1000;
decimal speed = decimal.Parse(initialSpeed.Text) / 1000;
decimal newAngle = DegreesToRadians(decimal.Parse(angle.Text));
double doubleNewAngle = (double)newAngle;
decimal Px = Math.Round(((decimal)Math.Cos(doubleNewAngle) * 0.001M), 13);
decimal Py = Math.Round(((decimal)Math.Sin(doubleNewAngle) * 0.001M), 13);
string PxTemp = "";
for(decimal t = 0.001M; Py > 0; t = t + 0.001M)
{
gravity = gravity + gravity * 0.001M;
Py = Py + speed - gravity;
Px = (Px + speed * Px);
graphics.DrawArc(new Pen(Color.Magenta, 10f), 45 + (float)Px, 475 - (float)Py, 1, 1, 0, 360);
try
{
graphics.DrawArc(new Pen(Color.Magenta, 10f), 45 + (float)Px, 475 - (float)Py, 1, 1, 0, 360);
}
catch
{
MessageBox.Show("Error Px: " + Px.ToString() + " Py: " + Py.ToString(), "Error");
this.Close();
}
我正在尝试创建弹丸模拟器,我已经成功创建了 y 轴上的重力和加速度效果。但是,当将速度应用于 x 轴时(使速度取决于角度),我遇到了麻烦。我可以做到这一点,射弹每秒移动 1 米,但为了使其正确,射弹穿过 x 轴的速度应取决于速度和角度。
为此我做了:
Px = Px + (speed * Px)
其中Px是跨轴的距离值角度的余弦值:
decimal Px = Math.Round(((decimal)Math.Cos(doubleNewAngle) * 0.001M), 13);
当我做
Px = Px + (speed * Px)
值returns一些巨大的数字例如4412651515851.41214244121,我起初认为这是因为Px超出了它的精度点但是我所做的任何舍入尝试都失败了,我应该如何获得正确的Px数?
这是一张形象化的图片:
任何帮助将不胜感激,我整天都在苦苦挣扎,但我在网上找不到任何东西。提前致谢。
运动定律与您使用的非常不同:
y'' = -g --> y(t) = y0 + vy0*t - g/2*t*t
x'' = 0 --> x(t) = x0 + vx0*t
这些是无空气摩擦运动的解决方案。大多数复杂的运动方程都需要对 ODE 进行数值积分。
初始速度 vx0,vy0
是您最初在 Px,Py
中计算的速度。但也许你应该使用
vx0 = speed*cos(angle)
vy0 = speed*sin(angle)
以获得与输入兼容的初始速度。可能需要进行一些额外的单位换算。
需要一个有用的工具来帮助进行正确的计算。http://www.mrmont.com/teachers/physicsteachershelper-proj.html
首先,这是代码:
decimal gravity = decimal.Parse(gforce.Text) / 1000;
decimal speed = decimal.Parse(initialSpeed.Text) / 1000;
decimal newAngle = DegreesToRadians(decimal.Parse(angle.Text));
double doubleNewAngle = (double)newAngle;
decimal Px = Math.Round(((decimal)Math.Cos(doubleNewAngle) * 0.001M), 13);
decimal Py = Math.Round(((decimal)Math.Sin(doubleNewAngle) * 0.001M), 13);
string PxTemp = "";
for(decimal t = 0.001M; Py > 0; t = t + 0.001M)
{
gravity = gravity + gravity * 0.001M;
Py = Py + speed - gravity;
Px = (Px + speed * Px);
graphics.DrawArc(new Pen(Color.Magenta, 10f), 45 + (float)Px, 475 - (float)Py, 1, 1, 0, 360);
try
{
graphics.DrawArc(new Pen(Color.Magenta, 10f), 45 + (float)Px, 475 - (float)Py, 1, 1, 0, 360);
}
catch
{
MessageBox.Show("Error Px: " + Px.ToString() + " Py: " + Py.ToString(), "Error");
this.Close();
}
我正在尝试创建弹丸模拟器,我已经成功创建了 y 轴上的重力和加速度效果。但是,当将速度应用于 x 轴时(使速度取决于角度),我遇到了麻烦。我可以做到这一点,射弹每秒移动 1 米,但为了使其正确,射弹穿过 x 轴的速度应取决于速度和角度。
为此我做了:
Px = Px + (speed * Px)
其中Px是跨轴的距离值角度的余弦值:
decimal Px = Math.Round(((decimal)Math.Cos(doubleNewAngle) * 0.001M), 13);
当我做
Px = Px + (speed * Px)
值returns一些巨大的数字例如4412651515851.41214244121,我起初认为这是因为Px超出了它的精度点但是我所做的任何舍入尝试都失败了,我应该如何获得正确的Px数?
这是一张形象化的图片:
任何帮助将不胜感激,我整天都在苦苦挣扎,但我在网上找不到任何东西。提前致谢。
运动定律与您使用的非常不同:
y'' = -g --> y(t) = y0 + vy0*t - g/2*t*t
x'' = 0 --> x(t) = x0 + vx0*t
这些是无空气摩擦运动的解决方案。大多数复杂的运动方程都需要对 ODE 进行数值积分。
初始速度 vx0,vy0
是您最初在 Px,Py
中计算的速度。但也许你应该使用
vx0 = speed*cos(angle)
vy0 = speed*sin(angle)
以获得与输入兼容的初始速度。可能需要进行一些额外的单位换算。
需要一个有用的工具来帮助进行正确的计算。http://www.mrmont.com/teachers/physicsteachershelper-proj.html