5

所以,我不是最懂数学的人,我希望能得到一些急需的反馈。对于初学者,我的目标只是让图像追逐我的鼠标。发生了一些我没想到会收到反馈的事情。

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

提前感谢您的帮助!

4

1 回答 1

3

我不知道你的变量vector和是什么意思distance,但是 IMO 应该交换它们的名称。在您的代码中,vectordiff向量的长度,它是使用毕达哥拉斯定理计算的:

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)与鼠标位置完全相同。因为您使用浮点数作为您的位置(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]
于 2013-01-03T16:39:19.293 回答