Algorithm 四壁间弹跳球目标算法

Algorithm 四壁间弹跳球目标算法,algorithm,animation,collision,Algorithm,Animation,Collision,我正在尝试实现一个球在4个垂直墙之间反弹的动画,即球的速度恒定。问题是,我使用的框架要求我在每次球与墙碰撞时告诉球的起点和终点 在碰撞的瞬间,我可以访问球的当前位置和以前与墙壁接触的位置。给定墙的坐标x_min、x_max、y_min和y_max,以及球的这两个位置,计算其下一个位置的最简单方法是什么 我想到的所有算法都遵循某种蛮力方法,有许多if-else语句。。。我想知道是否有一些优雅的方法来处理这个问题。假设上一次反弹是在位置(x_min,y_prev)离开左墙,而当前反弹是在位置(x_c

我正在尝试实现一个球在4个垂直墙之间反弹的动画,即球的速度恒定。问题是,我使用的框架要求我在每次球与墙碰撞时告诉球的起点和终点

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


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

假设上一次反弹是在位置(x_min,y_prev)离开左墙,而当前反弹是在位置(x_curr,y_max)离开顶墙。下一次反弹应在(x_max,y_next)处离开右墙,其中:

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

+--*----+
| / \   |
|/   \  |
*     \ |
|      \|
|       *
|       |
+-------+
如果y_next小于y_min,则表示球将在右墙之前击中底墙。测试将在(x_next,y_min)进行,其中:

大概是这样的:

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

假设上一次反弹在位置(x_min,y_prev)离开左墙,当前反弹在位置(x_curr,y_max)离开顶墙。下一次反弹应在(x_max,y_next)处离开右墙,其中:

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

+--*----+
| / \   |
|/   \  |
*     \ |
|      \|
|       *
|       |
+-------+
如果y_next小于y_min,则表示球将在右墙之前击中底墙。测试将在(x_next,y_min)进行,其中:

大概是这样的:

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

假设上一次反弹在位置(x_min,y_prev)离开左墙,当前反弹在位置(x_curr,y_max)离开顶墙。下一次反弹应在(x_max,y_next)处离开右墙,其中:

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

+--*----+
| / \   |
|/   \  |
*     \ |
|      \|
|       *
|       |
+-------+
如果y_next小于y_min,则表示球将在右墙之前击中底墙。测试将在(x_next,y_min)进行,其中:

大概是这样的:

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

假设上一次反弹在位置(x_min,y_prev)离开左墙,当前反弹在位置(x_curr,y_max)离开顶墙。下一次反弹应在(x_max,y_next)处离开右墙,其中:

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

+--*----+
| / \   |
|/   \  |
*     \ |
|      \|
|       *
|       |
+-------+
如果y_next小于y_min,则表示球将在右墙之前击中底墙。测试将在(x_next,y_min)进行,其中:

大概是这样的:

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

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

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

+------+------+--*---+
|      |      | *    |
|      |      |*     |
+------+------*------+
|      |     *|      |
|      |    * |      |
+------+---*--+------+
|      |  *   |      |
|      | *    |      |
+------+*-----+------+
|      *      |      |
|     *|      |      |
+----*-+------+------+
|   *  |      |      |
|  *   |      |      |
+-*----+------+------+
(您需要反射矩形,但随后“免费”获得反弹)

我很确定你可以使用类似的 计算交点


[感谢您的投票,但我必须说,我认为这可能是一个痛苦的世界。跟踪反射,特别是如果恰好碰到一个角落,将是一件棘手的事情……有时使用丑陋的代码更容易!]

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

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

+------+------+--*---+
|      |      | *    |
|      |      |*     |
+------+------*------+
|      |     *|      |
|      |    * |      |
+------+---*--+------+
|      |  *   |      |
|      | *    |      |
+------+*-----+------+
|      *      |      |
|     *|      |      |
+----*-+------+------+
|   *  |      |      |
|  *   |      |      |
+-*----+------+------+
(您需要反射矩形,但随后“免费”获得反弹)

我很确定你可以使用类似的 计算交点


[感谢您的投票,但我必须说,我认为这可能是一个痛苦的世界。跟踪反射,特别是如果恰好碰到一个角落,将是一件棘手的事情……有时使用丑陋的代码更容易!]

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

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

+------+------+--*---+
|      |      | *    |
|      |      |*     |
+------+------*------+
|      |     *|      |
|      |    * |      |
+------+---*--+------+
|      |  *   |      |
|      | *    |      |
+------+*-----+------+
|      *      |      |
|     *|      |      |
+----*-+------+------+
|   *  |      |      |
|  *   |      |      |
+-*----+------+------+
(您需要反射矩形,但随后“免费”获得反弹)

我很确定你可以使用类似的 计算交点


[感谢您的投票,但我必须说,我认为这可能是一个痛苦的世界。跟踪反射,特别是如果恰好碰到一个角落,将是一件棘手的事情……有时使用丑陋的代码更容易!]

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

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

+------+------+--*---+
|      |      | *    |
|      |      |*     |
+------+------*------+
|      |     *|      |
|      |    * |      |
+------+---*--+------+
|      |  *   |      |
|      | *    |      |
+------+*-----+------+
|      *      |      |
|     *|      |      |
+----*-+------+------+
|   *  |      |      |
|  *   |      |      |
+-*----+------+------+
(您需要反射矩形,但随后“免费”获得反弹)

我很确定你可以使用类似的 计算交点