Python-PyGame-学习向量/动画

jts*_*287 5 python pygame vector-graphics

因此,我不是数学知识最渊博的人,希望获得一些急需的反馈。对于初学者来说,我的目标只是使图像追逐鼠标。发生了一些我没想到会收到反馈的事情。

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]
Run Code Online (Sandbox Code Playgroud)

(可以在此处查看整个程序http://ideone.com/6OxWLi

在此先感谢您的帮助!

opa*_*tut 3

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

d^2 = dx^2 + dy^2
d = sqrt(dx^2 + dy^2)
Run Code Online (Sandbox Code Playgroud)

在您的代码中,有一个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 = ...`
Run Code Online (Sandbox Code Playgroud)

从现在开始,每次我写distance,我都假设你已经交换了名称,并表示距离值,而不是归一化向量。与 相同,从现在开始vector我将其称为(归一化差分向量)。diff_norm

现在,针对您的问题:

当您使用向量时,1)和2)应该更好diff_norm(归一化差异向量而不是归一化位置向量,这确实没有意义:P)。

3)图像的位置不太可能在任何时候都恰好(self.xPos, self.yPos)是鼠标的位置。因为你使用浮点数来表示你的位置(Python 会为你做到这一点),所以它们可能永远不会精确地位于像素上。所以你的图像永远不会精确地位于鼠标位置。因此,您不应该编写 ,而应该检查图像到鼠标的距离是否非常接近,例如小于 1 或两个像素:(self.xPos, self.yPos) == mouse_pos

if distance <= 2: return
Run Code Online (Sandbox Code Playgroud)

另外,你不需要最后的所有 if/else - 向量diff_norm可以有负值,所以你不需要检查它们是否为负 - 只需从位置向量中减去 diff_norm 向量,如下所示:

self.xPos -= diff[0]
self.yPos -= diff[1]
Run Code Online (Sandbox Code Playgroud)