在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Python模擬導彈自動追蹤的代碼實例

馬哥Linux運維 ? 來源:博客園 ? 作者:半壺砂 ? 2021-06-13 16:35 ? 次閱讀

自動追蹤算法,在我們制作射擊類游戲時經常會用到。這個聽起來很高大上的東西,其實并不是軍事學的專利,從數學上來說就是解微分方程,這個沒有點數學基礎是很難算出來的。但是我們有了計算機就不一樣了,依靠計算機極快速的運算速度,我們利用微分的思想,加上一點簡單的三角學知識,就可以實現它。

由于待會要用pygame演示,它的坐標系是y軸向下,所以這里我們也用y向下的坐標系。算法總的思想就是根據上圖,把時間t分割成足夠小的片段(比如1/1000,這個時間片越小越精確),每一個片段分別構造如上三角形,計算出導彈下一個時間片走的方向(即∠a)和走的路程(即vt=|AC|),這時候目標再在第二個時間片移動了位置,這時剛才計算的C點又變成了第二個時間片的初始點,這時再在第二個時間片上在C點和新的目標點構造三角形計算新的vt,然后進入第三個時間片,如此反復即可。

假定導彈和目標的初始狀態下坐標分別是(x1,y1),(x,y),構造出直角三角形ABE,這個三角形用來求∠a的正弦和余弦值,因為vt是自己設置的,我們需要計算A到C點x和y坐標分別移動了多少,移動的值就是AD和CD的長度,這兩個分別用vt乘cos(a)和sin(a)即可。計算sin(a)和cos(a),正弦對比斜,余弦鄰比斜,斜邊可以利用兩點距離公式計算出,即。

8152f754-c668-11eb-9e57-12bb97331649.png

于是

815a5800-c668-11eb-9e57-12bb97331649.png

AC的長度就是導彈的速度乘以時間即 |AC|=vt,然后即可計算出AD和CD的長度,于是這一個時間片過去后,導彈應該出現在新的位置C點,他的坐標就是老的點A的x增加AD和y減去CD。于是,新的C點坐標就是。

8163a220-c668-11eb-9e57-12bb97331649.png

只要一直反復循環執行這個操作即可,好吧,為了更形象,把第一個時間片和第二個時間片放在一起看看。第一個是時間片構造出的三角形是ABE,經過一個時間片后,目標從B點走到了D點,導彈此時在C點,于是構造新的三角形CDF,重復剛才的計算過程即可,圖中的角∠b就是導彈需要旋轉的角度,現實中只需要每個時間片修正導彈的方向就可以了,具體怎么讓導彈改變方向,這就不是我們需要研究的問題了好,由于最近在用Python的pygame庫制作小游戲玩,接下來我們就用pygame來演示一下這個效果,效果如下圖。

很簡單的代碼如下。

import pygame,sysfrom math import *pygame.init()screen=pygame.display.set_mode((800,700),0,32)missile=pygame.image.load(‘element/red_pointer.png’).convert_alpha()x1,y1=100,600 #導彈的初始發射位置

velocity=800 #導彈速度time=1/1000 #每個時間片的長度

clock=pygame.time.Clock()old_angle=0while True: for event in pygame.event.get(): if event.type==pygame.QUIT: sys.exit() clock.tick(300) x,y=pygame.mouse.get_pos() #獲取鼠標位置,鼠標就是需要打擊的目標

distance=sqrt(pow(x1-x,2)+pow(y1-y,2)) #兩點距離公式

section=velocity*time #每個時間片需要移動的距離

sina=(y1-y)/distance cosa=(x-x1)/distance angle=atan2(y-y1,x-x1) #兩點線段的弧度值

x1,y1=(x1+section*cosa,y1-section*sina) d_angle = degrees(angle) #弧度轉角度

screen.blit(missile, (x1-missile.get_width(), y1-missile.get_height()/2)) dis_angle=d_angle-old_angle #dis_angle就是到下一個位置需要改變的角度

old_angle=d_angle #更新初始角度 pygame.display.update()

如果僅把導彈考慮為一個質點的話,那么以上算法就已經足矣,我沒有做導彈的旋轉,因為一個質點也不分頭尾不需要旋轉,當然這前提得是你加載的導彈圖片很小的時候不旋轉看起來也沒什么問題。但是在pygame里面做旋轉并不是一件容易的事情,我們先把圖片替換成一張矩形的,再加入旋轉函數看看效果如何

missiled = pygame.transform.rotate(missile, -(d_angle))screen.blit(missiled, (x1-missile.get_width(), y1-missile.get_height()/2))

因為圖片的坐標點是它的左上角的點,所以如果我們想讓圖片的坐標固定在箭頭尖點,那么把圖片實際打印位置x減少圖片長度,y減少一半寬度就行。但是實際運行效果并不好。大致方向相同,但是圖片箭頭的尖點并沒有一直跟隨鼠標,這是為什么呢。經過一番研究,我發現原來是這個圖旋轉的機制問題,我們看看旋轉后的圖片變成什么樣了旋轉后的圖片變成了藍色的那個范圍,根據旋轉角度的不同,所變成的圖片大小也不一樣,我們看旋轉90的情況我們發現,旋轉后的圖片不僅面積變大了,導彈頭的位置也變了。

那應該怎么解決這個問題呢?思路是,每一次旋轉圖片以后,求出旋轉圖的頭位置(圖中的綠色箭頭點),然后把綠圖的打印位置移動一下,下,x,y分別移動兩個頭的距離,就可以讓旋轉后的導彈頭對準實際我們參與運算的那個導彈頭的位置,移動后應該是這樣的。這樣,兩個導彈頭的點就一致了。接下來我們分析求旋轉后的導彈頭的算法。根據旋轉角度的不同,旋轉角在不同象限參數不一樣,所以我們分為這四種情況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)所以最后我們加入相關算法代碼,效果就比較完美了大功告成,最后附上全部的算法代碼

import pygame,sysfrom math import *pygame.init()font1=pygame.font.SysFont(‘microsoftyaheimicrosoftyaheiui’,23)textc=font1.render

(‘*’,True,(250,0,0))screen=pygame.display.set_mode((800,700),0,32)missile=pygame.image.load(‘element/rect1.png’).convert_alpha()height=missile.get_height()width=missile.get_width()pygame.mouse.set_visible(0)x1,y1=100,600 #導彈的初始發射位置

velocity=800 #導彈速度time=1/1000 #每個時間片的長度clock=pygame.time.Clock()A=()B=()C=()while True: for event in pygame.event.get(): if event.type==pygame.QUIT: sys.exit() clock.tick(300) x,y=pygame.mouse.get_pos() #獲取鼠標位置,鼠標就是需要打擊的目標

distance=sqrt(pow(x1-x,2)+pow(y1-y,2)) #兩點距離公式

section=velocity*time #每個時間片需要移動的距離

sina=(y1-y)/distance cosa=(x-x1)/distance angle=atan2(y-y1,x-x1) #兩點間線段的弧度值

fangle=degrees(angle) #弧度轉角度

x1,y1=(x1+section*cosa,y1-section*sina) missiled=pygame.transform.rotate(missile,-(fangle)) if 0《=-fangle《=90: A=(width*cosa+x1-width,y1-height/2) B=(A[0]+height*sina,A[1]+height*cosa) if 90《-fangle《=180:

A = (x1 - width, y1 - height/2+height*(-cosa)) B = (x1 - width+height*sina, y1 - height/2) if -90《=-fangle《0:

A = (x1 - width+missiled.get_width(), y1 - height/2+missiled.get_height()-height*cosa) B = (A[0]+height*sina, y1 - height/2+missiled.get_height()) if -180《-fangle《-90: A = (x1-width-height*sina, y1 - height/2+missiled.get_height()) B = (x1 - width,A[1]+height*cosa )

C = ((A[0] + B[0]) / 2, (A[1] + B[1]) / 2) screen.fill((0,0,0)) screen.blit(missiled, (x1-width+(x1-C[0]),y1-height/2+(y1-C[1]))) screen.blit(textc, (x,y)) #鼠標用一個紅色*代替 pygame.display.update()

以上便是用Python模擬導彈自動追蹤的代碼實例。

原文標題。通過Python實現導彈自動追蹤

文章出處。【微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 代碼
    +關注

    關注

    30

    文章

    4809

    瀏覽量

    68826
  • python
    +關注

    關注

    56

    文章

    4801

    瀏覽量

    84882

原文標題:通過Python實現導彈自動追蹤

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    華為云 Flexus X 實例下的場景體驗——小企業使用 Python 語言——超迅速搭建簡單公網 API 接口服務

    ? 前言 小企業為了快速搞定一些接口功能如果不使用 Python 的話相對來說復雜度還是很高的,這里我來通過【華為云 Flexus X 實例】來迅速的搭建一個 Python 的 WebApi 示例
    的頭像 發表于 12-27 13:46 ?133次閱讀
    華為云 Flexus X <b class='flag-5'>實例</b>下的場景體驗——小企業使用 <b class='flag-5'>Python</b> 語言——超迅速搭建簡單公網 API 接口服務

    使用Python進行串口通信的案例

    python復制代碼 import serialimport time # 配置串口參數serial_port = '/dev/ttyUSB0' # 在Windows上可能是 'COM3' 或其他類
    的頭像 發表于 11-22 09:11 ?331次閱讀

    對比Python與Java編程語言

    Python與Java都是目前非常流行的編程語言,它們各有其獨特的優勢和適用場景。以下是對這兩種編程語言的對比: 一、語法和易用性 Python 語法簡潔,代碼更易讀,非常適合初學者。 動態類型系統
    的頭像 發表于 11-15 09:31 ?382次閱讀

    Python環境下的代理服務器搭建與自動化管理

    Python環境下搭建與自動化管理代理服務器是一項涉及網絡編程和自動化技術的綜合任務。
    的頭像 發表于 11-14 07:31 ?199次閱讀

    使用Python進行圖像處理

    下面是一個關于使用Python在幾行代碼中分析城市輪廓線的快速教程。
    的頭像 發表于 11-07 10:14 ?259次閱讀
    使用<b class='flag-5'>Python</b>進行圖像處理

    如何自動生成verilog代碼

    介紹幾種自動生成verilog代碼的方法。
    的頭像 發表于 11-05 11:45 ?387次閱讀
    如何<b class='flag-5'>自動</b>生成verilog<b class='flag-5'>代碼</b>

    pytorch和python的關系是什么

    ,PyTorch已經成為了一個非常受歡迎的框架。本文將介紹PyTorch和Python之間的關系,以及它們在深度學習領域的應用。 Python簡介 Python是一種高級、解釋型、通用的編程語言,由Guido van Rossu
    的頭像 發表于 08-01 15:27 ?2135次閱讀

    Python在AI中的應用實例

    Python在人工智能(AI)領域的應用極為廣泛且深入,從基礎的數據處理、模型訓練到高級的應用部署,Python都扮演著至關重要的角色。以下將詳細探討Python在AI中的幾個關鍵應用實例
    的頭像 發表于 07-19 17:16 ?1241次閱讀

    Python中的人工智能框架與實例

    在人工智能(AI)領域,Python因其簡潔的語法、豐富的庫和強大的社區支持,成為了最受歡迎的編程語言之一。本文將詳細介紹Python中的人工智能框架,并通過具體實例展示如何使用這些框架來實現不同的人工智能應用。
    的頭像 發表于 07-15 14:54 ?1772次閱讀

    用pycharm進行python爬蟲的步驟

    提供了許多有用的功能,如代碼自動完成、調試和版本控制等。您可以從JetBrains的官方網站下載PyCharm,并根據您的需求選擇免費社區版或付費專業版。 創建一個新的Python項目 打開
    的頭像 發表于 07-11 10:11 ?908次閱讀

    使用Python進行自然語言處理

    在探討使用Python進行自然語言處理(NLP)的廣闊領域時,我們首先需要理解NLP的基本概念、其重要性、Python在NLP中的優勢,以及如何通過Python實現一些基礎的NLP任務。本文將從這些方面展開,并深入介紹幾個關鍵的
    的頭像 發表于 07-04 14:40 ?479次閱讀

    OpenHarmony實例應用:【常用組件和容器低代碼

    基于ArkTS語言的低代碼開發方式實現的一個簡單實例
    的頭像 發表于 04-14 09:27 ?851次閱讀
    OpenHarmony<b class='flag-5'>實例</b>應用:【常用組件和容器低<b class='flag-5'>代碼</b>】

    Python自動化測試框架及其應用

    Pytest是一個非常成熟的全功能的Python測試框架,與python自帶的unittest測試框架類似,但是比unittest框架使用起來更簡潔,功能更強大。
    的頭像 發表于 04-03 16:15 ?579次閱讀
    <b class='flag-5'>Python</b><b class='flag-5'>自動</b>化測試框架及其應用

    通過Python腳本實現WIFI密碼的自動猜解

    本文將記錄學習下如何通過 Python 腳本實現 WIFI 密碼的自動猜解。
    的頭像 發表于 01-25 10:46 ?3555次閱讀
    通過<b class='flag-5'>Python</b>腳本實現WIFI密碼的<b class='flag-5'>自動</b>猜解

    Python智能家居系統代碼介紹

    Python智能家居系統是一種基于Python編程語言開發的智能家居控制系統,在現代家庭中得到了越來越廣泛的應用。本文將詳細介紹Python智能家居系統的代碼實現,包括系統的結構與功能
    的頭像 發表于 01-25 09:46 ?1416次閱讀
    主站蜘蛛池模板: 天天摸天天做天天爽水多| 欧美freesex10一|3| 亚洲午夜免费视频| wwwwww色| 亚洲精品美女久久久久网站| 毛片网站网址| 色站视频| 一区二区三区影院| 最新丁香六月| 五月亭亭激情五月| 日韩在线天堂免费观看| 欧美一级特黄aa大片视频| 欧美在线观看视频一区| 免费在线播放毛片| 丁香狠狠| 天天操天天添| 国产精品福利一区二区亚瑟| 男人搡女人视频免费看| 国产在线精品香蕉综合网一区| 国产亚洲美女精品久久久2020| 欧美性白人极品1819hd高清| 一区二区三区中文| 2021av网站| 色香首页| 狠狠色丁香久久婷婷综合丁香 | 成年女人毛片免费视频| 夜夜艹天天干| 喷潮白浆直流在线播放| 天天干干干| 插插天天| 深夜动态福利gif进出粗暴| 亚洲国产欧美视频| 欧美h视频| 新版天堂资源中文8在线| 福利午夜最新| 国产三级观看久久| 日本三浦理惠子中文字幕| 色老板在线视频一区二区| 免费国产zzzwww色| 97人人插| 天天爽夜夜爽人人爽|