Не работает формула для просчитывания полета

Рейтинг: 0Ответов: 0Опубликовано: 22.05.2023

У меня есть такой набросок введите сюда описание изображения

Мне нужно как-то прописать формулы для полета камня в зависимости от массы и угла.

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;
        }
    }
}

Вот код, у меня сейчас это, но не работает, помогите пожалуйста как это вообще сделать не представляю

Ответы

Ответов пока нет.