使用角度移动矩形

时间:2014-06-02 15:18:46

标签: c# graphics angle drawrectangle

我需要使用角度移动矩形。实际上我想改变移动矩形的方向,当它到达我在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 个答案:

答案 0 :(得分:2)

您需要再次将矩形绘制到某个图像以供显示。我使用您已定义的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);
}

答案 1 :(得分:1)

Math.Asin(1)* dy是一个常数值。因此,您应该使用例如在计时器的每个Tick中递增的实例变量。

... * 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();
    }

答案 2 :(得分:1)

acos和asin是sin和cos的倒数,所以这两个函数的输出是一个角度(通常是弧度)。这使得代码不正确。

我强烈建议您阅读矢量和矩阵数学,因为使用欧拉角可能会非常混乱。

因此,您将获得位置向量P和运动向量M,当前位置为:

 P' = P + M.t

其中t是时间,P是原始位置,P'是目前的职位。

然后,当你想改变方向时,你可以创建一个旋转矩阵,并将运动矢量M乘以这个旋转矩阵。

这里的优点是,您可以通过向矢量添加Z分量并增加矩阵的大小,从2D系统步进到3D系统。