迭代方法的想法是一种构造点云链表数据的常用思想。
迭代方法在Python中事实上是一段能够“引用自身”的函数。在函数中调用自身时,能够将此函数输出的结果作为此函数下一次迭代过程的输入。此过程不断地重复直到该函数的输出结果满足某个条件时停止迭代并输出某些值。
梯度下降
如图,梯度下降是迭代思想常见的用法,其目的为:从起点开始,通过一步步寻找周围梯度最大方向的下降点,直到迭代到的点周围全为上升点为止。
在此例中我们可以看到,在图中的两个起点都可以找到明确的终点来结束迭代。但是在很多情况下这种迭代依据的平面函数都是无限的,如函数y=1/x。这种函数是找不着停止迭代的最低点的,为了能够结束迭代,我们通常会对函数或迭代步数加以限制。
收敛条件
在很多游戏中我们可能需要用到一颗子弹从起点到终点越来越慢的情况,这些子弹到我们玩家周围很近的时候速度慢到几乎静止,由于这些物体运行的“距离——速度”函数的限制。子弹可能永远也无法到达我们玩家所处的坐标,从而无法达到碰撞销毁的条件。此时,我们认为这类子弹位置的迭代计算是“发散”的。这个运动的进程没有结果。
如下图,想要用迭代的方法实现以下类似“子弹时间”的效果,我们就需要用上一轮(上一秒)迭代的距离减去当前的速度作为下一轮(当前秒)迭代的输入距离。
此时,由于子弹速度随着与玩家的距离靠近而逐渐减慢,我们可以将在子弹距离玩家足够近的时候(小于某一距离)直接判断子弹与玩家已经产生碰撞从而销毁子弹的进程。
收敛条件是一种“约束”,迭代依据它的限制而停止。
问,现有一颗子弹朝我飞来(初始距离为10m,初始速度为5m/s),其速度与子弹到我们之间距离的关系为v=dist/2。求,当子弹运行到第几秒(迭代几次)时能够击中我(我们之间的距离小于1m)。
逻辑流
1.输入我的位置,子弹位置。
2. 构造子弹位置的迭代函数。
3.每次迭代计算子弹与我之间的距离,当距离小于1时停止迭代并输出迭代次数(击中所需时间)。
完整代码
position_bullet = 0
position_player = 10
literation_step = 0
def literation_bullet_position(position_bullet,literation_step,position_player):
literation_step += 1
dist = position_player - position_bullet
v = (dist)/2
position_bullet_new = position_bullet + v
print("second", literation_step, "[%s--□D--%s]"% (position_bullet_new , position_player - position_bullet_new))
if position_player - position_bullet_new > 1:
literation_bullet_position(position_bullet_new,literation_step,position_player)
else:
return position_bullet_new,literation_step
literation_bullet_position(position_bullet,literation_step,position_player)
图中可以看到子弹的位置在迭代4次后与玩家的距离小于1,判断子弹玩家发生碰撞停止迭代,子弹共计飞行了9.375m。