所以,我在数学方面不是最有见识的,希望得到一些急需的反馈。 对于初学者来说,我的目标只是让图像追逐我的鼠标。发生了几件我没想到会收到反馈的事情。
1) 追逐非常严格,以一种非常...“有角度”的方式跟随鼠标,仅在屏幕上似乎设置的点(中间 x 轴、中间 y 轴和对角线)。
2) 我希望速度保持恒定,但图像越靠近鼠标移动得越快。
3) 当图像到达鼠标时,它“弹弓”经过鼠标,造成模糊的狂乱,而不是到达鼠标位置并停止。
这些是我主要关心的问题,但如果您看到任何我可能误解的内容,请告诉我。我非常想了解整个矢量/三角函数(很快进入物理学)。
def follow (self):
mouse_pos = pygame.mouse.get_pos()
diff = (self.xPos-mouse_pos[0], self.yPos-mouse_pos[1])
vector = math.sqrt(diff[0]**2 + diff[1]**2)
distance = (self.xPos/vector, self.yPos/vector)
if (self.xPos, self.yPos) == mouse_pos:
return
if mouse_pos[0] >= self.xPos:
self.xPos += distance[0]
else:
self.xPos -= distance[0]
if mouse_pos[1] >= self.yPos:
self.yPos += distance[1]
else:
self.yPos -= distance[1]
(整个程序可以在这里看到 http://ideone.com/6OxWLi )
在此先感谢您的帮助!
最佳答案
我不知道你的变量 vector
和 distance
是什么意思,但 IMO 应该交换它们的名称。在您的代码中,vector
是 diff
向量的长度,它是使用毕达哥拉斯定理计算的:
d^2 = dx^2 + dy^2
d = sqrt(dx^2 + dy^2)
在您的代码中,有一个distance
变量,它是位置向量,只是归一化了(除以它自己的长度)。这就是为什么我宁愿交换他们的名字。此外,更有趣的是规范化形式的 diff
向量。所以宁愿这样做:
distance = math.sqrt(diff[0]**2, diff[1]**2) # instead of `vector = ...`
diff_norm = (diff[0] / distance, diff[1] / distance) # instead of `distance = ...`
从现在开始,每次我编写 distance
时,我都假设您已经交换了名称,并且指的是距离值,而不是归一化向量。与 vector
相同,从现在开始我将其称为 diff_norm
(归一化差异向量)。
现在,针对您的问题:
1) 和 2) 当您使用 diff_norm
向量(归一化差异向量而不是归一化位置向量,这真的没有意义 :P)时应该更好。
3) 您的图像位置 (self.xPos, self.yPos)
不太可能恰好在任何时候的鼠标位置。因为你使用 float 作为你的位置(python 为你做),它们可能永远不会精确地在像素上。所以您的图像永远不会完全在鼠标位置。因此,与其编写 (self.xPos, self.yPos) == mouse_pos
,不如检查图像与鼠标的距离是否真的很近,例如少于 1 或 2 个像素:
if distance <= 2: return
此外,您不需要最后的所有 if/else - diff_norm
向量可以有负值,所以您不需要检查它们是否为负 - 只需减去来自位置向量的 diff_norm 向量,如下所示:
self.xPos -= diff[0]
self.yPos -= diff[1]
关于Python - PyGame - 学习向量/动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14142282/