我需要在Python中编写这四个if
。注意它的作用,是在循环中的四种可能状态之间进行更改:1,0 -> 0,1 -> -1,0 -> 0,-1
并返回第一个。
if [dx, dy] == [1,0]:
dx, dy = 0, 1
if [dx, dy] == 0, 1:
dx, dy = -1, 0
if [dx, dy] == [-1, 0]
dx, dy = 0, -1
if [dx, dy] == [0, -1]:
dx, dy = 1, 0
有人能建议我更好/更好地写这个吗?
答案 0 :(得分:156)
dx, dy = -dy, dx
如有疑问,请应用数学。 ;)
答案 1 :(得分:55)
马格努斯的建议无疑是你提出的问题的正确答案,但一般来说,你想用字典来解决这样的问题:
statemap = {(1, 0): (0, 1), (0, 1): (-1, 0), (-1, 0): (0, -1), (0, -1): (1, 0)}
dx, dy = statemap[dx, dy]
即使在这种情况下我可以争论使用字典更好,因为很明显有四个状态并且它们重复,但很难抵抗所有的纯粹美数学。
顺便说一下,你问题中的代码中有一个错误,假设你测试的值是唯一可能的值,则相当于:
dx, dy = 1, 0
错误是您需要elif
用于第二个和后续条件,否则您将在更改后继续测试dx
和dy
。如果他们是1
和0
,那么您的所有条件都将是真实的并且最终结果相同!如果它们以0
和1
开头,那么第二个和所有后续条件都将成立,您最终会以1, 0
结束。等等...
答案 2 :(得分:31)
只是扩展马格纳斯的答案。如果你想象[dx,dy]作为向量,你实际做的是rotation 90度(或PI / 2)。
要计算这一点,您可以使用以下转换:
在您的情况下转换为:
x = x * cos(90) - y * sin(90)
y = x * sin(90) + y * cos(90)
自sin(90) = 1
和cos(90) = 0
以来,我们将其简化为:
x, y = -y, x
你有它!
答案 3 :(得分:18)
您正在使用的值似乎是一个连续旋转的单位矢量 - 换句话说,是phasor。 Complex numbers are coordinates,所以:
# at initialization
phase = 1
# at the point of modification
phase *= 1j
dx, dy = phase.real, phase.imag
假设我对dx的含义的解释,dy值是正确的,这为你提供了额外的灵活性,以防你以后想要在每一步中旋转一些其他数量。
答案 4 :(得分:6)
虽然我会选择Magnus的回答,但这是另一种旋转一组值的方法:
def rotate(*states):
while 1:
for state in states:
yield state
for dx, dy in rotate((1, 0), (0, 1), (-1, 0), (0, -1)):
pass
请注意,break
循环中某处应该有for dx, dy
,否则它永远不会结束。