Python 硬币旋转减速代码不能正常工作

Python 硬币旋转减速代码不能正常工作,python,rotation,psychopy,acceleration,Python,Rotation,Psychopy,Acceleration,我试图模拟硬币的旋转。一个完整的旋转被建模为一个参数从1到-1再到1的变化,1是直硬币,-1是倒转硬币。硬币应该逐渐减速。该函数的参数是硬币在停止前要转半圈的次数、移动的帧数以及硬币旋转的初始速度(每帧半圈) 首先,我用公式2*(位移-初始时间)/time*时间计算减速度值。然后我创建一个列表,其中包含每个帧的距离值。这里出现了一些问题,因为值非常高。(我省略了代码中将位置值限制在1和-1之间的部分,因为在到达该点之前出现了一些错误) 我希望new_dist list在n_frames中达到n_

我试图模拟硬币的旋转。一个完整的旋转被建模为一个参数从1到-1再到1的变化,1是直硬币,-1是倒转硬币。硬币应该逐渐减速。该函数的参数是硬币在停止前要转半圈的次数、移动的帧数以及硬币旋转的初始速度(每帧半圈)

首先,我用公式
2*(位移-初始时间)/time*时间
计算减速度值。然后我创建一个列表,其中包含每个帧的距离值。这里出现了一些问题,因为值非常高。(我省略了代码中将位置值限制在1和-1之间的部分,因为在到达该点之前出现了一些错误)

我希望new_dist list在n_frames中达到n_half_turns值帧数(new_dist list的长度),从一定的速度开始并适当减速。然而,我在运行代码时得到的更像是一个寓言:首先位置增加,然后超过n_半_圈,然后返回到它。新的地区列表是:

[1, 1.8200000000000003, 2.4600000000000004, 2.9200000000000004, 3.2, 3.3000000000000007, 3.2200000000000006, 2.960000000000001, 2.520000000000001, 1.9000000000000012]
可能是部分答案(可能还有其他问题),但至少这个公式是错误的:

2 * (displacement - v * time) / time*time
因为除法优先于乘法,所以它等价于

2 * (displacement - v * time)
当你想要的时候:

2 * (displacement - v * time) / (time*time)
快速演示:

>>> 1/4*4
1.0
>>> 1/(4*4)
0.0625
另外,在你的循环中,更多的是一个物理问题:

for i in range(n_frames):
    position += position * v
    frame_distance.append(position)
    v += v * deceleration
没有道理。如果我理解正确,每次迭代都是经过的时间。因此,你只需将速度加上,而不是速度与位置的乘积,就可以将速度应用到位置上,这就解释了为什么你的位置会飙升

速度变化也是如此。我的建议:

for i in range(n_frames):
    position += v
    frame_distance.append(position)
    v += deceleration
通过所有这些修复,我得到了一组好看的值,不确定它们是否正常,但看起来更好:

[1.0, 1.0984, 1.1952, 1.2904, 1.384, 1.476, 1.5664, 1.6552, 1.7424, 1.8279999999999998, 1.912, 1.9943999999999997, 2.0751999999999997, 2.1544, 2.2319999999999998, 2.308, 2.3823999999999996, 2.4551999999999996, 2.5263999999999993, 2.595999999999999, 2.6639999999999993, 2.730399999999999, 2.795199999999999, 2.8583999999999987, 2.9199999999999986, 2.9799999999999986, 3.0383999999999984, 3.0951999999999984, 3.1503999999999985, 3.2039999999999984, 3.2559999999999985, 3.3063999999999982, 3.355199999999998, 3.4023999999999983, 3.447999999999998, 3.491999999999998, 3.534399999999998, 3.575199999999998, 3.614399999999998, 3.651999999999998, 3.687999999999998, 3.7223999999999977, 3.7551999999999977, 3.7863999999999978, 3.8159999999999976, 3.8439999999999976, 3.8703999999999974, 3.8951999999999973, 3.918399999999997, 3.9399999999999973, 3.959999999999997, 3.9783999999999966, 3.9951999999999965, 4.010399999999997, 4.023999999999997, 4.035999999999996, 4.046399999999997, 4.055199999999996, 4.062399999999997, 4.067999999999996, 4.071999999999996, 4.074399999999995, 4.075199999999995, 4.074399999999995, 4.071999999999996, 4.067999999999996, 4.062399999999995, 4.055199999999996, 4.046399999999995, 4.035999999999996, 4.023999999999996, 4.010399999999995, 3.9951999999999948, 3.978399999999995, 3.959999999999995, 3.9399999999999946, 3.9183999999999943, 3.8951999999999942, 3.8703999999999943, 3.843999999999994, 3.815999999999994, 3.786399999999994, 3.755199999999994, 3.722399999999994, 3.687999999999994, 3.651999999999994, 3.614399999999994, 3.575199999999994, 3.534399999999994, 3.4919999999999938, 3.4479999999999937, 3.402399999999994, 3.3551999999999937, 3.306399999999994, 3.2559999999999936, 3.2039999999999935, 3.1503999999999936, 3.0951999999999935, 3.0383999999999936, 2.9799999999999933]
可能是部分答案(可能还有其他问题),但至少这个公式是错误的:

2 * (displacement - v * time) / time*time
因为除法优先于乘法,所以它等价于

2 * (displacement - v * time)
当你想要的时候:

2 * (displacement - v * time) / (time*time)
快速演示:

>>> 1/4*4
1.0
>>> 1/(4*4)
0.0625
另外,在你的循环中,更多的是一个物理问题:

for i in range(n_frames):
    position += position * v
    frame_distance.append(position)
    v += v * deceleration
没有道理。如果我理解正确,每次迭代都是经过的时间。因此,你只需将速度加上,而不是速度与位置的乘积,就可以将速度应用到位置上,这就解释了为什么你的位置会飙升

速度变化也是如此。我的建议:

for i in range(n_frames):
    position += v
    frame_distance.append(position)
    v += deceleration
通过所有这些修复,我得到了一组好看的值,不确定它们是否正常,但看起来更好:

[1.0, 1.0984, 1.1952, 1.2904, 1.384, 1.476, 1.5664, 1.6552, 1.7424, 1.8279999999999998, 1.912, 1.9943999999999997, 2.0751999999999997, 2.1544, 2.2319999999999998, 2.308, 2.3823999999999996, 2.4551999999999996, 2.5263999999999993, 2.595999999999999, 2.6639999999999993, 2.730399999999999, 2.795199999999999, 2.8583999999999987, 2.9199999999999986, 2.9799999999999986, 3.0383999999999984, 3.0951999999999984, 3.1503999999999985, 3.2039999999999984, 3.2559999999999985, 3.3063999999999982, 3.355199999999998, 3.4023999999999983, 3.447999999999998, 3.491999999999998, 3.534399999999998, 3.575199999999998, 3.614399999999998, 3.651999999999998, 3.687999999999998, 3.7223999999999977, 3.7551999999999977, 3.7863999999999978, 3.8159999999999976, 3.8439999999999976, 3.8703999999999974, 3.8951999999999973, 3.918399999999997, 3.9399999999999973, 3.959999999999997, 3.9783999999999966, 3.9951999999999965, 4.010399999999997, 4.023999999999997, 4.035999999999996, 4.046399999999997, 4.055199999999996, 4.062399999999997, 4.067999999999996, 4.071999999999996, 4.074399999999995, 4.075199999999995, 4.074399999999995, 4.071999999999996, 4.067999999999996, 4.062399999999995, 4.055199999999996, 4.046399999999995, 4.035999999999996, 4.023999999999996, 4.010399999999995, 3.9951999999999948, 3.978399999999995, 3.959999999999995, 3.9399999999999946, 3.9183999999999943, 3.8951999999999942, 3.8703999999999943, 3.843999999999994, 3.815999999999994, 3.786399999999994, 3.755199999999994, 3.722399999999994, 3.687999999999994, 3.651999999999994, 3.614399999999994, 3.575199999999994, 3.534399999999994, 3.4919999999999938, 3.4479999999999937, 3.402399999999994, 3.3551999999999937, 3.306399999999994, 3.2559999999999936, 3.2039999999999935, 3.1503999999999936, 3.0951999999999935, 3.0383999999999936, 2.9799999999999933]


你错过了适当的缩进,也很抱歉,我是新来的网站。我应该如何改变问题的主体以满足“如何提问”的要求?我以前读过这一页,我认为我的问题符合指南。我也不确定如何增加代码块的缩进。问题是大量的解释和代码。这将是最好的,如果你能提供一个我修改它,希望它更好地满足标准。谢谢你对当地海关的帮助!甚至没有阅读就恢复了向下和向上投票,只是为了减少和倾听评论。现在居然发现了一个可疑的东西!!你错过了适当的缩进,也很抱歉,我是新来的网站。我应该如何改变问题的主体以满足“如何提问”的要求?我以前读过这一页,我认为我的问题符合指南。我也不确定如何增加代码块的缩进。问题是大量的解释和代码。这将是最好的,如果你能提供一个我修改它,希望它更好地满足标准。谢谢你对当地海关的帮助!甚至没有阅读就恢复了向下和向上投票,只是为了减少和倾听评论。现在居然发现了一个可疑的东西!!哦,对了,这很有道理。更新代码中的新距离仍然上升到6933.400093777868,我希望它上升到2。
position+=position*v
?你确定?它将位置*v添加到现有位置。是否要将经过的时间*速度添加到位置?事实上,
v+=v*减速
position+=v
也一样(不是物理专家,但我编写了一些游戏)。哦,是的,现在看起来肯定好多了。编辑是有意义的。由于某些原因,它仍然不能像预期的那样工作——特别是,位置超出预期的数字,然后又回到原来的位置。例如,在运行animate_rotation(1,10,0.5)时,位置为[1.0,1.42,1.7599999999999999998,2.019999999999999996,2.19999999999999999993,2.29999999999999999999994,2.319999999999999999994,2.259999999999999999999999,2.11999999999999999999,1.89999999]。这似乎比以前更现实,因为这是一个寓言,但它不是我的本意。哦,对了,这很有道理。更新代码中的新距离仍然上升到6933.400093777868,我希望它上升到2。
position+=position*v
?你确定?它将位置*v添加到现有位置。是否要将经过的时间*速度添加到位置?事实上,
v+=v*减速
position+=v
也一样(不是物理专家,但我编写了一些游戏)。哦,是的,现在看起来肯定好多了。编辑是有意义的。由于某些原因,它仍然不能像预期的那样工作——特别是,位置超出预期的数字,然后又回到原来的位置。例如,在运行animate_rotation(1,10,0.5)时,位置为[1.0,1.42,1.7599999999999999998,2.019999999999999996,2.19999999999999999993,2.29999999999999999999994,2.319999999999999999994,2.259999999999999999999999,2.11999999999999999999,1.89999999]。这似乎比以前更现实,因为这是一个寓言,但它不是我的本意。