神級程序員教你用Python實現簡單的導彈自動追蹤!此乃裝逼神技!
由於待會要用pygame演示,他的坐標系是y軸向下,所以這裏我們也用y向下的坐標系。
計算sina和cosa,正弦對比斜,余弦鄰比斜,斜邊可以利用兩點距離公式計算出,即:
於是
AC的長度就是導彈的速度乘以時間即 |AC|=vt,然後即可計算出AD和CD的長度,於是這一個時間片過去後,導彈應該出現在新的位置C點,他的坐標就是老的點A的x增加AD和y減去CD。
於是,新的C點坐標就是:
只要一直反復循環執行這個操作即可,好吧,為了更形象,把第一個時間片和第二個時間片放在一起看看:
很簡單的代碼如下:
如果僅把導彈考慮為一個質點的話,那麽以上算法就已經足矣,我沒有做導彈的旋轉,因為一個質點也不分頭尾不需要旋轉,當然這前提得是你加載的導彈圖片很小的時候不旋轉看起來也沒什麽問題。但是在pygame裏面做旋轉並不是一件容易的事情(也可能是我無知),好吧我們先把圖片替換成一張矩形的,再加入旋轉函數看看效果如何
因為圖片的坐標點是它的左上角的點,所以如果我們想讓圖片的坐標固定在箭頭尖點,那麽把圖片實際打印位置x減少圖片長度,y減少一半寬度就行。
但是實際運行效果並不好:
大致方向相同,但是圖片箭頭的尖點並沒有一直跟隨鼠標,這是為什麽呢。經過我的研究(就因為這個問題沒解決一直沒發布),
我發現原來是這個圖旋轉的機制問題,我們看看旋轉後的圖片變成什麽樣了:
旋轉後的圖片變成了藍色的那個範圍,根據旋轉角度的不同,所變成的圖片大小也不一樣,我們看旋轉90的情況
這樣,兩個導彈頭的點就一致了。接下來我們分析求旋轉後的導彈頭的算法。根據旋轉角度的不同,旋轉角在不同象限參數不一樣,所以我們分為這四種情況
1,2象限
3,4象限,它的旋轉只有正負0—180,所以3,4象限就是負角
顯示圖片的時候我們將他移動
-
screen.blit(missiled,(x1-width+(x1-C[0]),y1-height/2+(y1-C[1])))
這裏的(x1-width,y1-height/2)其實才是上圖中的(x1,y1)
所以最後我們加入相關算法代碼,效果就比較完美了
大功告成,最後附上全部的算法代碼
歡迎大家加入萬人交流,資源共享群::125240963
神級程序員教你用Python實現簡單的導彈自動追蹤!此乃裝逼神技!