91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Python模擬導(dǎo)彈自動(dòng)追蹤的代碼實(shí)例

馬哥Linux運(yùn)維 ? 來(lái)源:博客園 ? 作者:半壺砂 ? 2021-06-13 16:35 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

自動(dòng)追蹤算法,在我們制作射擊類游戲時(shí)經(jīng)常會(huì)用到。這個(gè)聽起來(lái)很高大上的東西,其實(shí)并不是軍事學(xué)的專利,從數(shù)學(xué)上來(lái)說(shuō)就是解微分方程,這個(gè)沒(méi)有點(diǎn)數(shù)學(xué)基礎(chǔ)是很難算出來(lái)的。但是我們有了計(jì)算機(jī)就不一樣了,依靠計(jì)算機(jī)極快速的運(yùn)算速度,我們利用微分的思想,加上一點(diǎn)簡(jiǎn)單的三角學(xué)知識(shí),就可以實(shí)現(xiàn)它。

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

假定導(dǎo)彈和目標(biāo)的初始狀態(tài)下坐標(biāo)分別是(x1,y1),(x,y),構(gòu)造出直角三角形ABE,這個(gè)三角形用來(lái)求∠a的正弦和余弦值,因?yàn)関t是自己設(shè)置的,我們需要計(jì)算A到C點(diǎn)x和y坐標(biāo)分別移動(dòng)了多少,移動(dòng)的值就是AD和CD的長(zhǎng)度,這兩個(gè)分別用vt乘cos(a)和sin(a)即可。計(jì)算sin(a)和cos(a),正弦對(duì)比斜,余弦鄰比斜,斜邊可以利用兩點(diǎn)距離公式計(jì)算出,即。

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

于是

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

AC的長(zhǎng)度就是導(dǎo)彈的速度乘以時(shí)間即 |AC|=vt,然后即可計(jì)算出AD和CD的長(zhǎng)度,于是這一個(gè)時(shí)間片過(guò)去后,導(dǎo)彈應(yīng)該出現(xiàn)在新的位置C點(diǎn),他的坐標(biāo)就是老的點(diǎn)A的x增加AD和y減去CD。于是,新的C點(diǎn)坐標(biāo)就是。

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

只要一直反復(fù)循環(huán)執(zhí)行這個(gè)操作即可,好吧,為了更形象,把第一個(gè)時(shí)間片和第二個(gè)時(shí)間片放在一起看看。第一個(gè)是時(shí)間片構(gòu)造出的三角形是ABE,經(jīng)過(guò)一個(gè)時(shí)間片后,目標(biāo)從B點(diǎn)走到了D點(diǎn),導(dǎo)彈此時(shí)在C點(diǎn),于是構(gòu)造新的三角形CDF,重復(fù)剛才的計(jì)算過(guò)程即可,圖中的角∠b就是導(dǎo)彈需要旋轉(zhuǎn)的角度,現(xiàn)實(shí)中只需要每個(gè)時(shí)間片修正導(dǎo)彈的方向就可以了,具體怎么讓導(dǎo)彈改變方向,這就不是我們需要研究的問(wèn)題了好,由于最近在用Python的pygame庫(kù)制作小游戲玩,接下來(lái)我們就用pygame來(lái)演示一下這個(gè)效果,效果如下圖。

很簡(jiǎn)單的代碼如下。

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 #導(dǎo)彈的初始發(fā)射位置

velocity=800 #導(dǎo)彈速度time=1/1000 #每個(gè)時(shí)間片的長(zhǎng)度

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() #獲取鼠標(biāo)位置,鼠標(biāo)就是需要打擊的目標(biāo)

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

section=velocity*time #每個(gè)時(shí)間片需要移動(dòng)的距離

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

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

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

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

如果僅把導(dǎo)彈考慮為一個(gè)質(zhì)點(diǎn)的話,那么以上算法就已經(jīng)足矣,我沒(méi)有做導(dǎo)彈的旋轉(zhuǎn),因?yàn)橐粋€(gè)質(zhì)點(diǎn)也不分頭尾不需要旋轉(zhuǎn),當(dāng)然這前提得是你加載的導(dǎo)彈圖片很小的時(shí)候不旋轉(zhuǎn)看起來(lái)也沒(méi)什么問(wèn)題。但是在pygame里面做旋轉(zhuǎn)并不是一件容易的事情,我們先把圖片替換成一張矩形的,再加入旋轉(zhuǎn)函數(shù)看看效果如何

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

因?yàn)閳D片的坐標(biāo)點(diǎn)是它的左上角的點(diǎn),所以如果我們想讓圖片的坐標(biāo)固定在箭頭尖點(diǎn),那么把圖片實(shí)際打印位置x減少圖片長(zhǎng)度,y減少一半寬度就行。但是實(shí)際運(yùn)行效果并不好。大致方向相同,但是圖片箭頭的尖點(diǎn)并沒(méi)有一直跟隨鼠標(biāo),這是為什么呢。經(jīng)過(guò)一番研究,我發(fā)現(xiàn)原來(lái)是這個(gè)圖旋轉(zhuǎn)的機(jī)制問(wèn)題,我們看看旋轉(zhuǎn)后的圖片變成什么樣了旋轉(zhuǎn)后的圖片變成了藍(lán)色的那個(gè)范圍,根據(jù)旋轉(zhuǎn)角度的不同,所變成的圖片大小也不一樣,我們看旋轉(zhuǎn)90的情況我們發(fā)現(xiàn),旋轉(zhuǎn)后的圖片不僅面積變大了,導(dǎo)彈頭的位置也變了。

那應(yīng)該怎么解決這個(gè)問(wèn)題呢?思路是,每一次旋轉(zhuǎn)圖片以后,求出旋轉(zhuǎn)圖的頭位置(圖中的綠色箭頭點(diǎn)),然后把綠圖的打印位置移動(dòng)一下,下,x,y分別移動(dòng)兩個(gè)頭的距離,就可以讓旋轉(zhuǎn)后的導(dǎo)彈頭對(duì)準(zhǔn)實(shí)際我們參與運(yùn)算的那個(gè)導(dǎo)彈頭的位置,移動(dòng)后應(yīng)該是這樣的。這樣,兩個(gè)導(dǎo)彈頭的點(diǎn)就一致了。接下來(lái)我們分析求旋轉(zhuǎn)后的導(dǎo)彈頭的算法。根據(jù)旋轉(zhuǎn)角度的不同,旋轉(zhuǎn)角在不同象限參數(shù)不一樣,所以我們分為這四種情況1,2象限3,4象限,它的旋轉(zhuǎn)只有正負(fù)0—180,所以3,4象限就是負(fù)角顯示圖片的時(shí)候我們將他移動(dòng)

screen.blit(missiled, (x1-width+(x1-C[0]),y1-height/2+(y1-C[1])))這里的 (x1-width, y1-height/2) 其實(shí)才是上圖中的 (x1, y1)所以最后我們加入相關(guān)算法代碼,效果就比較完美了大功告成,最后附上全部的算法代碼

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 #導(dǎo)彈的初始發(fā)射位置

velocity=800 #導(dǎo)彈速度time=1/1000 #每個(gè)時(shí)間片的長(zhǎng)度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() #獲取鼠標(biāo)位置,鼠標(biāo)就是需要打擊的目標(biāo)

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

section=velocity*time #每個(gè)時(shí)間片需要移動(dòng)的距離

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

fangle=degrees(angle) #弧度轉(zhuǎn)角度

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)) #鼠標(biāo)用一個(gè)紅色*代替 pygame.display.update()

以上便是用Python模擬導(dǎo)彈自動(dòng)追蹤的代碼實(shí)例。

原文標(biāo)題。通過(guò)Python實(shí)現(xiàn)導(dǎo)彈自動(dòng)追蹤

文章出處?!疚⑿殴娞?hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4970

    瀏覽量

    74019
  • python
    +關(guān)注

    關(guān)注

    57

    文章

    4877

    瀏覽量

    90104

原文標(biāo)題:通過(guò)Python實(shí)現(xiàn)導(dǎo)彈自動(dòng)追蹤

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    電磁兼容仿真模擬系統(tǒng)平臺(tái):全景解析與應(yīng)用實(shí)例

    電磁兼容仿真模擬系統(tǒng)平臺(tái):全景解析與應(yīng)用實(shí)例
    的頭像 發(fā)表于 03-10 10:39 ?80次閱讀
    電磁兼容仿真<b class='flag-5'>模擬</b>系統(tǒng)平臺(tái):全景解析與應(yīng)用<b class='flag-5'>實(shí)例</b>

    電子凸輪同步追蹤的方案分析

    電子凸輪同步追蹤技術(shù)作為工業(yè)自動(dòng)化領(lǐng)域的核心控制策略,其本質(zhì)是通過(guò)軟件算法模擬機(jī)械凸輪的運(yùn)動(dòng)特性,實(shí)現(xiàn)多軸間的高精度相位同步。該技術(shù)突破了傳統(tǒng)機(jī)械凸輪的物理限制,在包裝機(jī)械、印刷設(shè)備、數(shù)控機(jī)床等場(chǎng)景中展現(xiàn)出顯著優(yōu)勢(shì)。以下從技術(shù)原
    的頭像 發(fā)表于 03-02 17:13 ?532次閱讀

    沒(méi)有專利的opencv-python 版本

    保留基礎(chǔ)功能,完全免費(fèi)合規(guī)),支持 Python 3.13 的版本為 4.8.0.74 及以上,安裝命令: # 清華源加速,安裝最新穩(wěn)定版(自動(dòng)匹配 Python 3.13) pip install
    發(fā)表于 12-13 12:37

    Python中借助NVIDIA CUDA Tile簡(jiǎn)化GPU編程

    模型更高的層級(jí)來(lái)實(shí)現(xiàn)算法。至于如何將計(jì)算任務(wù)拆分到各個(gè)線程,完全由編譯器和運(yùn)行時(shí)在底層自動(dòng)處理。不僅如此,tile kernels 還能夠屏蔽 Tensor Core 等專用硬件的細(xì)節(jié),寫出的代碼還能
    的頭像 發(fā)表于 12-13 10:12 ?1212次閱讀
    在<b class='flag-5'>Python</b>中借助NVIDIA CUDA Tile簡(jiǎn)化GPU編程

    Termux中調(diào)試圣誕樹Python代碼

    在Termux中調(diào)試Python代碼(以圣誕樹立例)非常簡(jiǎn)單,核心分為環(huán)境準(zhǔn)備、代碼編寫、運(yùn)行調(diào)試三個(gè)步驟,下面一步步教你操作: 一、環(huán)境準(zhǔn)備(首次使用需做) Termux默認(rèn)可能沒(méi)有Pyth
    發(fā)表于 12-09 09:02

    語(yǔ)法糾錯(cuò)和testbench的自動(dòng)生成

    ,回到寫好的Verilog代碼,按住ctrl+shift+p,在彈出的搜索框里輸入testbench。 點(diǎn)擊后會(huì)自動(dòng)將當(dāng)前模塊的testbench生成在終端框內(nèi)。 當(dāng)然,本質(zhì)上該插件還是通過(guò)python來(lái)實(shí)現(xiàn)的,因此
    發(fā)表于 10-27 07:07

    Python 給 Amazon 做“全身 CT”——可量產(chǎn)、可擴(kuò)展的商品詳情爬蟲實(shí)戰(zhàn)

    ? 目標(biāo)字段 & CSS 選擇器 ? 四、MVP:120 行代碼即可跑通 單文件腳本,支持異步并發(fā) 10 個(gè) ASIN,自動(dòng)
    的頭像 發(fā)表于 10-21 16:59 ?528次閱讀
    用 <b class='flag-5'>Python</b> 給 Amazon 做“全身 CT”——可量產(chǎn)、可擴(kuò)展的商品詳情爬蟲實(shí)戰(zhàn)

    基于RT-Thread與K230(玄鐵C908)的運(yùn)動(dòng)目標(biāo)控制與追蹤系統(tǒng) | 技術(shù)集結(jié)

    與引腳映射軟件與運(yùn)行環(huán)境標(biāo)定與坐標(biāo)映射(關(guān)鍵)代碼結(jié)構(gòu)與主要函數(shù)使用方法擴(kuò)展:自動(dòng)追蹤紅色光斑(對(duì)接題目(5))時(shí)間與性能估算常見問(wèn)題安全與注意事項(xiàng)項(xiàng)目源碼項(xiàng)目概述目
    的頭像 發(fā)表于 08-29 17:04 ?6112次閱讀
    基于RT-Thread與K230(玄鐵C908)的運(yùn)動(dòng)目標(biāo)控制與<b class='flag-5'>追蹤</b>系統(tǒng) | 技術(shù)集結(jié)

    termux如何搭建python游戲

    模擬器,支持通過(guò)APT包管理器安裝軟件。搭建Python游戲開發(fā)環(huán)境前需完成以下基礎(chǔ)配置: 1. 更換國(guó)內(nèi)源 為提升下載速度,需替換Termux默認(rèn)源為清華源,執(zhí)行以下命令: ```bash
    發(fā)表于 08-29 07:06

    Python腳本實(shí)現(xiàn)運(yùn)維工作自動(dòng)化案例

    還在為重復(fù)性運(yùn)維工作而煩惱?每天被各種告警、監(jiān)控、部署搞得焦頭爛額?作為一名有10年經(jīng)驗(yàn)的運(yùn)維老司機(jī),今天分享5個(gè)超實(shí)用的Python自動(dòng)化腳本,讓你的運(yùn)維工作效率提升300%!這些都是我在生產(chǎn)環(huán)境中實(shí)際使用的案例,代碼簡(jiǎn)潔高效
    的頭像 發(fā)表于 08-27 14:46 ?1183次閱讀

    模擬導(dǎo)彈熱電池指示信號(hào)的電路設(shè)計(jì)與實(shí)現(xiàn)

    在某型導(dǎo)彈的設(shè)計(jì)中,熱電池激活后,產(chǎn)生電池電壓經(jīng)DC-DC模塊轉(zhuǎn)換最終發(fā)送給發(fā)射裝置作為熱電池工作正常的指示信號(hào),這是導(dǎo)彈接口中一個(gè)關(guān)鍵信號(hào),本文提出的電路設(shè)計(jì)正是用于模擬此信號(hào)。
    的頭像 發(fā)表于 06-20 09:45 ?2.4w次閱讀
    <b class='flag-5'>模擬</b><b class='flag-5'>導(dǎo)彈</b>熱電池指示信號(hào)的電路設(shè)計(jì)與實(shí)現(xiàn)

    基于STM32的智能水產(chǎn)養(yǎng)殖系統(tǒng)電路+代碼+論文實(shí)例打包下載

    基于STM32的智能水產(chǎn)養(yǎng)殖系統(tǒng)電路+代碼+論文實(shí)例打包,推薦下載!
    發(fā)表于 05-29 21:40

    實(shí)例解讀模擬電子技術(shù)

    資料介紹:本文通過(guò)豐富多彩的應(yīng)用實(shí)例,由淺入深地剖析模擬電子電路各方面的知識(shí)。例如,通過(guò)電子地動(dòng)儀的介紹帶領(lǐng)讀者進(jìn)入電子學(xué)的殿堂,通過(guò)USB充電器和電池保護(hù)器介紹有關(guān)直流電源的知識(shí),通過(guò)電子聽診器
    發(fā)表于 05-16 13:29

    零基礎(chǔ)入門:如何在樹莓派上編寫和運(yùn)行Python程序?

    是一種非常有用的編程語(yǔ)言,其語(yǔ)法易于閱讀,允許程序員使用比匯編、C或Java等語(yǔ)言更少的代碼行。Python編程語(yǔ)言最初實(shí)際上是作為L(zhǎng)inux的腳本語(yǔ)言而開發(fā)的。Py
    的頭像 發(fā)表于 03-25 09:27 ?2068次閱讀
    零基礎(chǔ)入門:如何在樹莓派上編寫和運(yùn)行<b class='flag-5'>Python</b>程序?

    27個(gè)FPGA實(shí)例代碼

    本資料收集匯總了27個(gè)FPGA實(shí)例代碼,有需要的可以下載學(xué)習(xí)! 獲取完整文檔資料可下載附件哦!?。。∪绻麅?nèi)容有幫助可以關(guān)注、點(diǎn)贊、評(píng)論支持一下哦~
    發(fā)表于 03-14 17:31