4个墙之间的弹跳球目的地算法

时间:2013-10-19 22:56:25

标签: algorithm animation collision

我正在尝试实现一个球在4个垂直墙之间弹跳的动画,这是球的速度不变。问题是,我正在使用的框架要求我每次碰撞墙时都要告诉球的起源和目的地。

在碰撞的那一刻,我可以看到球的当前和以前与墙壁接触的位置。给定墙的坐标x_min,x_max,y_min和y_max,以及球的这两个位置,计算下一个位置的最简单方法是什么?

我想到的所有算法都遵循一种蛮力方法,有许多if-else语句......我想知道是否有一些优雅的方法来处理它。

3 个答案:

答案 0 :(得分:1)

假设先前的反弹位于左侧墙的位置(x_min,y_prev),并且当前反弹偏离顶部墙(x_curr,y_max)。下一次反弹应该在右侧墙上(x_max,y_next),其中:

y_next = y_max - (y_max - y_prev) * (x_max - x_curr) / (x_curr - x_min)

由(前一个反弹,左上角,当前反弹)定义的三角形与三角形(当前反弹,右上角,下一次反弹)相似(相同形状但不同大小)的简单几何形状。像这样:

+--*----+
| / \   |
|/   \  |
*     \ |
|      \|
|       *
|       |
+-------+

如果y_next小于y_min,则意味着球将击中右墙前的底壁。意志发生在(x_next,y_min)其中:

x_next = x_curr + (x_curr - x_min) * (y_max - y_min) / (y_max - y_prev)

这样的事情:

+--*------+
| / \     |
|/   \    |
*     \   |
|      \  |
+-------*-+

答案 1 :(得分:1)

[对不起,这是不完整的 - 我会将其作为评论发布,但它太大而涉及ascii艺术。我可以稍后删除它。]

如果你想要一个紧凑,优雅的方法,可能更容易将球想象成一条直线,越过重复的矩形图案。

+------+------+--*---+
|      |      | *    |
|      |      |*     |
+------+------*------+
|      |     *|      |
|      |    * |      |
+------+---*--+------+
|      |  *   |      |
|      | *    |      |
+------+*-----+------+
|      *      |      |
|     *|      |      |
+----*-+------+------+
|   *  |      |      |
|  *   |      |      |
+-*----+------+------+

(你需要反映矩形,然后“免费”获得弹跳)。

我很确定你可以使用与bresenham's algorithm类似的东西  计算交点。

[感谢投票,但我不得不说,我认为这可能是一个让人难以接受的痛苦世界。跟踪反射,特别是如果完全碰到一个角落,将会变得棘手......有时候用丑陋的代码生活会更容易!]

答案 2 :(得分:1)

我不确定这是否与您的想法相似,但我的想法是基本上计算位置,好像没有墙,然后使用墙壁翻转适用的坐标中心点。

所以,首先你计算:

new
 \
  \
   \
---------
     \
      \
      old

然后将其翻译为:

---------
   / \
  /   \
 /    old
new

的伪代码:

newX = oldX + xInc
newY = oldY + yInc

if newX < 0
  newX = -newX

if newY < 0
  newY = -newY

if newX > maxX
  newX = maxX - (newX - maxX)
  // or 2*maxX - newX

if newY > maxY
  newY = maxY - (newY - maxY)
  // or 2*maxY - newY