Python 从边界内移动的距离获取位置-X

Python 从边界内移动的距离获取位置-X,python,Python,我有两个蓝点朝相反的方向移动。我得到了X轴上点可以移动的大小限制。在本例中,它总共是300个单位(从0开始在任意方向上为150个单位) 每个蓝色点从0(中心)开始,我得到了每个点移动的总距离。我在编写一个函数时遇到了问题,该函数将返回结果X位置。这是由下图中的浅蓝色圆点表示的。红线表示球可以在其中移动的边界,将红线视为墙,将蓝点视为弹跳球 我的目标是创建一个函数,用python返回这个值 您将在我的函数中看到,我有一个参数dir,用于确定球移动的方向(最初是向左还是向右) 下面是我试图解决的问

我有两个蓝点朝相反的方向移动。我得到了X轴上点可以移动的大小限制。在本例中,它总共是300个单位(从0开始在任意方向上为150个单位)

每个蓝色点从0(中心)开始,我得到了每个点移动的总距离。我在编写一个函数时遇到了问题,该函数将返回结果X位置。这是由下图中的浅蓝色圆点表示的。红线表示球可以在其中移动的边界,将红线视为墙,将蓝点视为弹跳球

我的目标是创建一个函数,用python返回这个值

您将在我的函数中看到,我有一个参数dir,用于确定球移动的方向(最初是向左还是向右)

下面是我试图解决的问题,但并不完全正确。当%中有剩余部分时,它似乎失败了

def find_position(dir=1, width=10, traveled=100):
    dist = traveled
    x = dist % (width*0.5)
    print x

find_position(dir=1, width=300, traveled=567)
find_position(dir=1, width=300, traveled=5)
find_position(dir=-1, width=300, traveled=5)
find_position(dir=-1, width=300, traveled=325)


>> output
117.0
5.0
5.0
25.0

>> should be
-33.0
5.0
-5.0
25.0

可以执行以下操作,m符号表示方向(通过设置150和300个参数,您可以轻松使其更通用):


这是我解决你问题的代码。我在代码中留下了注释,使其更易于解释。但是当X从0开始移动到-325时,你不应该期望X的坐标是-25吗

def find_position(dir=1, width=10, traveled=100):
    # coordinate translation
    curr_X = 150

    if traveled >= width:
        # remove periodicity in distance traveled
        dist = traveled % width * dir
    else:
        dist = traveled * dir

    new_X = ( dist + curr_X ) % width

    # translate coordinate back to original configuration
    new_X = new_X - width * 0.5
    return new_X

assert find_position(dir=1, width=300, traveled=567) == -33
assert find_position(dir=1, width=300, traveled=5) == 5
assert find_position(dir=-1, width=300, traveled=5) == -5
assert find_position(dir=-1, width=300, traveled=325) == -25

使用
%
和绝对值:

代码:

def find_position(direction=1, width=10, traveled=100):
    half_width = width / 2
    t = abs((traveled + half_width) % (2 * width) - width) - half_width
    return -t * direction
assert int(find_position(direction=1, width=300, traveled=567)) == -33.0
assert int(find_position(direction=1, width=300, traveled=5)) == 5
assert int(find_position(direction=-1, width=300, traveled=5)) == -5
assert int(find_position(direction=-1, width=300, traveled=325)) == 25
测试代码:

def find_position(direction=1, width=10, traveled=100):
    half_width = width / 2
    t = abs((traveled + half_width) % (2 * width) - width) - half_width
    return -t * direction
assert int(find_position(direction=1, width=300, traveled=567)) == -33.0
assert int(find_position(direction=1, width=300, traveled=5)) == 5
assert int(find_position(direction=-1, width=300, traveled=5)) == -5
assert int(find_position(direction=-1, width=300, traveled=325)) == 25

如果顶部圆点向右移动567个单位,那么它是如何在-33处移动的?一旦该点到达容器的边界,它就会向后移动到另一个方向。我会在问题上加上这一点啊,这更有意义。对不起,这是一个关键部分:)我只是忘了。谢谢你看到那件事。您也应该显示您得到的输出。显示糟糕的输出通常是问题的好补充。不是每个人都可以轻松地运行代码。您的解决方案非常接近。X应该是+25,因为它是X位置。把它想象成一个网格。最后的休息位置为正25。我们怎样才能修正呢?这就是为什么,如果你沿着-1的方向行驶325,你应该得到-25。你是正确的,从这个意义上说,它是-25个单位,从它的原始起始位置。但是如果你把这些点画在一个网格上,它将是0,结果的终点将是25wait Never最后的评论,我认为你的解决方案可能会满足我的需要。现在我来测试一下:)如何修改它以允许蓝点的起始位置在任何有红边界的地方?而不是总是假设它是0 try
traveled+=start*direction
作为函数的第一行的中心
assert int(find_position(direction=1, width=300, traveled=567)) == -33.0
assert int(find_position(direction=1, width=300, traveled=5)) == 5
assert int(find_position(direction=-1, width=300, traveled=5)) == -5
assert int(find_position(direction=-1, width=300, traveled=325)) == 25