Перемещение прямоугольника с помощью углов

мне нужно переместить прямоугольник, используя углы. На самом деле я хочу изменить направление моего движущегося прямоугольника, когда он достигнет места, которое я дал в своем коде в операторе if!

мне просто нужно, как я могу узнать, как переместить мой прямоугольник на 60, 30, 60, 120, 150, 270 Градусы!

предположим, что если

          circle.Y>=this.Height-80

посмотреть этот: enter image description here

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

if(circle.Y>=this.Height-80)
    move in the direction of 90 degrees

if(circle.X>=this.Width-80)
    move in the direction of 60 degree

как вы можете видеть на скриншоте!

то, что я пытался:

public partial class Form1 : Form
{
    Rectangle circle;
    double dx = 2;
    double dy = 2;

    public Form1()
    {
        InitializeComponent();
        circle = new Rectangle(10, 10, 40, 40);
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        this.Refresh();
    }

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        Graphics g = e.Graphics;
        g.SmoothingMode = SmoothingMode.AntiAlias;
        g.FillEllipse(new SolidBrush(Color.Red), circle);
    }

    private void timer_Tick(object sender, EventArgs e)
    {
        circle.X += (int)dx;
        circle.Y += (int)dy;
        if (circle.Y>=this.Height-80)
        {
            dy = -Math.Acos(0) * dy/dy; //here i want to change the direction of circle at 90 degrees so that it should go up vertically straight with same speed
        }
        this.Refresh();
    }
}

проблема в том, что я меняю условия:

dy = -Math.Asin(1) * dy;
dx = Math.Acos(0) * dx ;

но в обоих случаях ничего не происходит, и направление остается прежним! Я просто хочу переместить круг в перевернутом вверх направлении на 90 градусов, когда он достигнет

circle.Y>=this.Height-80

3 ответов


вам нужно снова нарисовать прямоугольник на какое-то изображение для его отображения. Я создал этот код для перемещения и рисования прямоугольника на pictureBox1, используя Ваш уже определен circle-прямоугольник:

перемещение прямоугольника:

public void MoveRectangle(ref Rectangle rectangle, double angle, double distance)
{
   double angleRadians = (Math.PI * (angle) / 180.0);
   rectangle.X = (int)((double)rectangle.X - (Math.Cos(angleRadians) * distance));
   rectangle.Y = (int)((double)rectangle.Y - (Math.Sin(angleRadians) * distance));
}

рисование прямоугольника и отображение его в PictureBox:

public void DrawRectangle(Rectangle rectangle)
{
   Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
   using (Graphics g = Graphics.FromImage(bmp))
   {
      g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
      g.FillEllipse(new SolidBrush(Color.Red), rectangle);
   }
   pictureBox1.Image = bmp;
}

демо его с помощью кнопки:

private void Button1_Click(object sender, EventArgs e)
{
   MoveRectangle(ref circle, 90, 5);
   DrawRectangle(circle);
}

математика.Asin (1) * dy-постоянное значение. Таким образом, вы должны использовать, например, переменную экземпляра, которая увеличивается в каждом ТИКе вашего таймера.

...И * dy / dy не имеет значения.

public partial class Form1 : Form
{
    Rectangle circle;
    double dx = 2;
    double dy = 2;
    acum=0; //the new variable

...

private void timer_Tick(object sender, EventArgs e)
    {
        circle.X += (int)dx;
        circle.Y += (int)dy;
        if (circle.Y>=this.Height-300)
        {
            dy = -Math.Acos(acum); 
            acum+=1; //your accumulator
        }
        this.Refresh();
    }

acos и asin являются обратными sin и cos, поэтому выход этих двух функций является углом (обычно в радианах). Это делает код неправильным.

Я настоятельно рекомендую вам прочитать векторную и матричную математику, поскольку использование углов Эйлера может стать довольно грязным.

Итак, у вас будет вектор положения P и вектор движения M, а текущая позиция:

 P' = P + M.t

где t-время, P-исходное положение, а P ' - текущее позиция.

затем, когда вы хотите изменить направление, вы создаете матрицу вращения и умножаете вектор движения M на эту матрицу вращения.

преимущество здесь в том, что вы можете перейти от 2D-системы к 3D-системе, добавив Z-компонент к вашим векторам и увеличив размер ваших матриц.