【问题标题】:Bouncing Ball Collision弹跳球碰撞
【发布时间】:2015-04-04 22:11:54
【问题描述】:

我正在编写一个程序,允许用户左键单击面板并添加一个弹跳球,然后右键单击以删除一个球。球以恒定的速度从所有墙壁反弹。我已经完成了这一切。我无法弄清楚的最后一部分是处理与其他弹跳球的碰撞。应该会出现与从墙壁反弹的结果相同的结果。任何帮助将不胜感激。这是到目前为止球运动的代码......

@SuppressWarnings("AccessingNonPublicFieldOfAnotherObject")
private void processMovement(long interval)
{    
    /* Compute the distance moved in the interval. Decompose the distance
moved into x and y components, and determine the next position of the Ball
by those amounts. */

    float x = position.x + velocity.getDistanceX(interval);
    float y = position.y + velocity.getDistanceY(interval);
    position.setLocation(x, y);

    /* Collisions with the walls. If so, adjust the speed and direction for
       the next period. */

    /* Collision with the east or west (vertical) wall. */
    float wall;
    if( x <= (wall = 0.0F) ||
            x >= (wall = model.getDimension().width - SIZE) )
    {
        x = wall;
        velocity.reverseX();
    }

    /* Collision with the north or south (horizontal) wall. */
    if( y <= (wall = 0.0F) ||
            y >= (wall = model.getDimension().height - SIZE) )
    {
        y = wall;
        velocity.reverseY();
    }
    position.setLocation(x, y);
}

【问题讨论】:

  • 到目前为止您尝试过什么?为什么它不起作用?这是家庭作业还是课程作业?
  • 您需要一个集合来存储每个球对象。然后,您需要根据彼此的位置检查它们以查看是否发生碰撞。 quradtree 结构是解决此问题的有效解决方案

标签: java multithreading


【解决方案1】:

当我编写这样的程序时,我最终创建了一个墙对象,它有一个开始 x/y 和一个结束 x/y。需要几何形状来确定正确的弹跳/反弹角度,因为墙壁可以处于任何方向。基本上,球的方向改变了墙壁和球方向之间的方向差异的两倍。例如,如果球在 X 轴上方 45* 处移动,而墙壁的方向在 X 轴上方 90* 处(即它是直上直下),那么球的新航向是其原始航向加上两个乘以它的朝向和墙的方向之间的差异,或者换句话说,45* + 2*(90*-45*),或者换句话说,135*。问题是,如果您认为墙的方向为 -90*(即 X 轴下方 90*,仍然是垂直向上和向下),则它不起作用。在这种情况下,您会将球的新航向计算为 -45*,这是错误的。如果您从左侧或右侧撞墙,这也很重要。有趣,对吧?很多事情要考虑。

当球的中心在 (R1 + R2) 距离内时,球会发生碰撞,其中 R1 是第一个球的半径,R2 是第二个球的半径。

基本上,我所做的是创建一个临时(不可见)墙,该墙与从一个球的中心到另一个球的中心的矢量垂直,然后我命令两个球从这堵墙上反弹。这给出了正确的弹跳行为。

我知道您可能并不关心我的“墙壁碰撞”问题,但我认为我所描述的内容可以让您对您需要执行的几何类型有所了解以解决问题这个问题。

简而言之,让球正确相互弹跳是很困难的。如果不需要和/或您不愿意花费精力,请考虑删除/放弃此功能。

你也可以把一些不太正确但更容易的东西放在一起。你可以简单地让球在碰撞时彼此远离,但这样你会得到看起来“不自然”的弹跳。

我知道这当然不能解决您的问题,但希望这会有所帮助。

【讨论】:

    【解决方案2】:

    在 Java 中(至少在使用 Bluej 作为环境时),左上角像素为 (0,0),左下角像素为 (600,600)(取决于窗口大小)。你的逻辑我不熟悉,但假设你的数学是正确的,让球在撞墙时反转方向,你应该每个球有 4 个 if 语句。我知道有一些方法可以摆脱 1 或 2,我的方法很丑陋而且不是很有效,但如果问题是你的逻辑数学,它至少会隔离。

    if (X<=0 || X>=600)
    {
     velocity.reverseX();
    }
    if (Y<=0 || Y>=600)
    {
    velocity.reverseY();
    }
    

    我希望这会有所帮助:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-28
      • 2010-10-21
      • 2016-05-14
      • 2016-09-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多