Не работает формула для просчитывания полета
Мне нужно как-то прописать формулы для полета камня в зависимости от массы и угла.
internal class Сatapults
{
int Stones5 = 2;
int Stones10 = 2;
int Stones15 = 2;
int Stones20 = 2;
bool Didit = false;
bool Toback = false;
string now = "none";
public Canvas StonesFS = new Canvas();
int to = 0;
int flyspeed = 0;
public RotateTransform RotateTransformStonekeeper = new RotateTransform();
public RotateTransform RotateTransformStonefs = new RotateTransform();
Image Stonekeeper;
bool stonekeeperIsMovingUp = false;
bool stonekeeperIsMovingDown = false;
double angle; // Угол в радианах
double initialVelocity = 10.0; // Начальная скорость камня
double g = 9.8; // Ускорение свободного падения
double time = 0.0; // Время полета
double x = 5; // Горизонтальная координата
double y = 5; // Вертикальная координата
Image stone5;
Image stone10;
Image stone15;
Image stone20;
public Сatapults(Image _stonekeeper)
{
Stonekeeper = _stonekeeper;
angle = -RotateTransformStonekeeper.Angle; // Угол в радианах
RotateTransformStonekeeper.Angle = -165;
RotateTransformStonefs.Angle = 0;
Stonekeeper.RenderTransform = RotateTransformStonekeeper;
}
public void KeyDown(object sender, KeyEventArgs e)
{
switch (e.Key)
{
case Key.Up:
stonekeeperIsMovingUp = true;
break;
case Key.Down:
stonekeeperIsMovingDown = true;
break;
}
}
public void KeyUp(object sender, KeyEventArgs e)
{
switch (e.Key)
{
case Key.Up:
stonekeeperIsMovingUp = false;
break;
case Key.Down:
stonekeeperIsMovingDown = false;
break;
}
}
public void Move_Stonekeeper(object sender, EventArgs e)
{
if (stonekeeperIsMovingUp)
{
if(RotateTransformStonekeeper.Angle < -165)
{
RotateTransformStonekeeper.Angle += 1;
RotateTransformStonefs.Angle += 1;
Stonekeeper.RenderTransform = RotateTransformStonekeeper;
}
}
else if (stonekeeperIsMovingDown)
{
if (RotateTransformStonekeeper.Angle > -210)
{
RotateTransformStonekeeper.Angle -= 1;
RotateTransformStonefs.Angle -= 1;
Stonekeeper.RenderTransform = RotateTransformStonekeeper;
}
}
}
public void Chosen_Stone20(object sender, MouseButtonEventArgs e)
{
stone5 = StonesFS.FindName("Stone5fs") as Image;
stone10 = StonesFS.FindName("Stone10fs") as Image;
stone15 = StonesFS.FindName("Stone15fs") as Image;
stone20 = StonesFS.FindName("Stone20fs") as Image;
stone20.RenderTransform = RotateTransformStonefs;
Canvas.SetLeft(stone20, 59);
Canvas.SetTop(stone20, 780);
Canvas.SetLeft(stone15, -118);
Canvas.SetTop(stone15, 763);
Canvas.SetLeft(stone10, -149);
Canvas.SetTop(stone10, 689);
Canvas.SetLeft(stone5, -145);
Canvas.SetTop(stone5, 823);
now = "st20";
}
public void Chosen_Stone15(object sender, MouseButtonEventArgs e)
{
stone5 = StonesFS.FindName("Stone5fs") as Image;
stone10 = StonesFS.FindName("Stone10fs") as Image;
stone15 = StonesFS.FindName("Stone15fs") as Image;
stone20 = StonesFS.FindName("Stone20fs") as Image;
stone15.RenderTransform = RotateTransformStonefs;
Canvas.SetLeft(stone20, -190);
Canvas.SetTop(stone20, 741);
Canvas.SetLeft(stone15, 61);
Canvas.SetTop(stone15, 782);
Canvas.SetLeft(stone10, -149);
Canvas.SetTop(stone10, 689);
Canvas.SetLeft(stone5, -145);
Canvas.SetTop(stone5, 823);
now = "st15";
}
public void Chosen_Stone10(object sender, MouseButtonEventArgs e)
{
stone5 = StonesFS.FindName("Stone5fs") as Image;
stone10 = StonesFS.FindName("Stone10fs") as Image;
stone15 = StonesFS.FindName("Stone15fs") as Image;
stone20 = StonesFS.FindName("Stone20fs") as Image;
stone10.RenderTransform = RotateTransformStonefs;
Canvas.SetLeft(stone20, -190);
Canvas.SetTop(stone20, 741);
Canvas.SetLeft(stone15, -118);
Canvas.SetTop(stone15, 763);
Canvas.SetLeft(stone10, 67);
Canvas.SetTop(stone10, 786);
Canvas.SetLeft(stone5, -145);
Canvas.SetTop(stone5, 823);
now = "st10";
}
public void Chosen_Stone5(object sender, MouseButtonEventArgs e)
{
stone5 = StonesFS.FindName("Stone5fs") as Image;
stone10 = StonesFS.FindName("Stone10fs") as Image;
stone15 = StonesFS.FindName("Stone15fs") as Image;
stone20 = StonesFS.FindName("Stone20fs") as Image;
stone5.RenderTransform = RotateTransformStonefs;
Canvas.SetLeft(stone20, -190);
Canvas.SetTop(stone20, 741);
Canvas.SetLeft(stone15, -118);
Canvas.SetTop(stone15, 763);
Canvas.SetLeft(stone10, -149);
Canvas.SetTop(stone10, 689);
Canvas.SetLeft(stone5, 70);
Canvas.SetTop(stone5, 790);
now = "st5";
}
public void Shoot(object sender, KeyEventArgs e)
{
if(e.Key == Key.Space)
{
Didit = true;
}
}
public void Shoot_Procces(object sender, EventArgs e)
{
if(RotateTransformStonekeeper.Angle < -90 && Didit && !Toback)
{
if(now == "st20")
{
RotateTransformStonekeeper.Angle += 5;
RotateTransformStonefs.Angle += 5;
}
else if(now == "st15")
{
RotateTransformStonekeeper.Angle += 8;
RotateTransformStonefs.Angle += 8;
}
else if(now == "st10")
{
RotateTransformStonekeeper.Angle += 11;
RotateTransformStonefs.Angle += 11;
}
else if(now == "st5")
{
RotateTransformStonekeeper.Angle += 15;
RotateTransformStonefs.Angle += 15;
}
else
{
Didit = false;
}
}
else
{
if(RotateTransformStonekeeper.Angle >= -90 || Toback)
{
Toback = true;
if(RotateTransformStonekeeper.Angle > -165)
{
RotateTransformStonekeeper.Angle -= 1;
RotateTransformStonefs.Angle -= 1;
}
else Toback = false;
}
if (y >= 0.0 && now != "none")
{
x = initialVelocity * Math.Cos(angle) * time;
y = initialVelocity * Math.Sin(angle) * time - 0.5 * g * Math.Pow(time, 2);
time += 0.1;
// Обновление положения камня
Canvas.SetLeft(stone20, x);
Canvas.SetTop(stone20, y);
}
Didit = false;
}
}
}
Вот код, у меня сейчас это, но не работает, помогите пожалуйста как это вообще сделать не представляю
Источник: Stack Overflow на русском