2013-01-03 43 views
4

所以,我不是數學知識最豐富的,並希望得到一些急需的反饋。 我的首要目標就是讓圖像追逐我的鼠標。有一些事情我沒有想到我想要反饋意見。Python - PyGame - 學習矢量/動畫

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

在此先感謝您的幫助!

回答

3

我不知道你的變數vectordistance是什麼意思,但是他們的名字應該交換。在代碼中,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個或兩個像素:

if distance <= 2: return 

而且,你並不需要所有的if/else在結束 - 的diff_norm向量可以有負值,所以你並不需要檢查,如果它們是消極的 - 只需從位置矢量中減去diff_norm矢量,如下所示:

self.xPos -= diff[0] 
self.yPos -= diff[1] 
+0

剛剛完成更改。它完美的作品。我瞭解了一點,但仍不是100%。非常感謝您的回答! – jtsmith1287

+0

你可能想觀看[this](https://www.khanacademy.org/math/linear-algebra/vectors_and_spaces/vectors/v/linear-algebra--introduction-to-vectors) - 介紹矢量,由khanacademy .ORG。他在數學上解釋了vector *是什麼*以及它的含義*。請務必觀看後續的視頻! – opatut