我正在尝试实现一个球在4个垂直墙之间弹跳的动画,这是球的速度不变。问题是,我正在使用的框架要求我每次碰撞墙时都要告诉球的起源和目的地。
在碰撞的那一刻,我可以看到球的当前和以前与墙壁接触的位置。给定墙的坐标x_min,x_max,y_min和y_max,以及球的这两个位置,计算下一个位置的最简单方法是什么?
我想到的所有算法都遵循一种蛮力方法,有许多if-else语句......我想知道是否有一些优雅的方法来处理它。
答案 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