Algorithm 四壁间弹跳球目标算法
我正在尝试实现一个球在4个垂直墙之间反弹的动画,即球的速度恒定。问题是,我使用的框架要求我在每次球与墙碰撞时告诉球的起点和终点 在碰撞的瞬间,我可以访问球的当前位置和以前与墙壁接触的位置。给定墙的坐标x_min、x_max、y_min和y_max,以及球的这两个位置,计算其下一个位置的最简单方法是什么Algorithm 四壁间弹跳球目标算法,algorithm,animation,collision,Algorithm,Animation,Collision,我正在尝试实现一个球在4个垂直墙之间反弹的动画,即球的速度恒定。问题是,我使用的框架要求我在每次球与墙碰撞时告诉球的起点和终点 在碰撞的瞬间,我可以访问球的当前位置和以前与墙壁接触的位置。给定墙的坐标x_min、x_max、y_min和y_max,以及球的这两个位置,计算其下一个位置的最简单方法是什么 我想到的所有算法都遵循某种蛮力方法,有许多if-else语句。。。我想知道是否有一些优雅的方法来处理这个问题。假设上一次反弹是在位置(x_min,y_prev)离开左墙,而当前反弹是在位置(x_c
我想到的所有算法都遵循某种蛮力方法,有许多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艺术。我可能会在以后删除它。] 如果你想要一个紧凑、优雅的方法,你可能更容易把球想象成一条直线,穿过一个重复的矩形图案
+------+------+--*---+
| | | * |
| | |* |
+------+------*------+
| | *| |
| | * | |
+------+---*--+------+
| | * | |
| | * | |
+------+*-----+------+
| * | |
| *| | |
+----*-+------+------+
| * | | |
| * | | |
+-*----+------+------+
(您需要反射矩形,但随后“免费”获得反弹)
我很确定你可以使用类似的
计算交点