1

我正在尝试使椭圆在矩形上反弹。我正在使用计时器在 x 和 y 方向上移动椭圆。我的想法是创建一个 if 语句来查看椭圆的坐标是否与矩形的坐标相匹配。

这是我到目前为止编写的代码:

  public partial class Form1 : Form
   {      
    Class1 square = new Class1();
    public int before;
    public int after;
    public int c;

    public Form1()
    {      
        InitializeComponent(); 
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        after = 590 - (b * b) / 100;
        before = 100 + (a * a) / 100;
        c = a + b;
        Graphics g = e.Graphics;
        SolidBrush Brush = new SolidBrush(Color.White);
        g.FillEllipse(Brush, a, before, 10, 10);            
        square.Draw(g);


        if (k >= square.y && a >= square.x && a <= square.x + 40)
        {
            a=c;
            before= after;
            timer1.Start();
            timer2.Stop();
        }
        else if (k >= square.y + 10)
        {
            timer2.Stop();
            MessageBox.Show("You lost");                
        }          
    }        

    protected override void OnMouseMove(MouseEventArgs e)
    {
        base.OnMouseMove(e);
        square.x = e.X;         
        Cursor.Hide();
    }

    public int a = 0;
    public int b = 0;

    public void timer2_Tick(object sender, EventArgs e)
    {
        a += 1;
        Invalidate();
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        b += 1;
        Invalidate();
    }
}

我知道有问题。我有一些问题:

  1. 有没有更简单的方法让椭圆“反弹”?
  2. 问题仅与椭圆所遵循的曲线的数学有关吗?

我知道这个问题可能有点未定义或抽象,但任何帮助都会得到帮助。如果你想让我在某些方面更清楚,请告诉我!谢谢

4

1 回答 1

0

使边缘的椭圆反弹的一种简单方法是检查其边缘点是否与边界一致,然后反转正确的方向。所以,这样的事情应该可以工作,如果你能原谅伪代码

loop used to animate the ellipse
before moving, check the position:

if right-most position == right wall
    invert x velocity
if left-most position == left wall
    invert x velocity
if top-most position == top wall
    invert y velocity
if bottom-most position == bottom wall
    invert y velocity

move ellipse to next position

这是一个非常简单的模拟,但它应该让您了解如何改进和开发更复杂的模型。希望这可以帮助!

于 2013-06-03T15:03:00.367 回答