导弹如何自动追踪目标?这其实是个数学问题

抛物线模拟合地对空导弹轨迹[python][抛物线][地对空导弹轨迹] 需求 给定地对空导弹发射起始点和终止点(3维坐标),拟合导弹轨迹 思路 1 首先简单化问题,假定导弹轨迹位于同一个平面内,则可以将轨迹投影到x-O-z平面,先求出x-z的关系,求一系列的散点, 然后根据x,y的关系求出y的散点值即可 2 之所以选取抛物线,因为导弹轨迹需要垂直发射的过程,存在斜率不存在的点常见的曲线为抛物线和圆,由于圆显然不合适,我们选取抛物线 实现效果 实现的数学逻辑 1 起始点和终止点的定义: # startPos and endPos in [lon, lat, height 阅读详情

点击上方“编程派”,选择设为“设为星标”

优质文章,第一时间送达!

Python 除了做机器学习、Web 开发,还能用来开发游戏,这个你知道吗?pygame 就是专门用于开发游戏的第三方库。本文将会介绍如何利用 pygame 来实现高大上的自动追踪算法。原文地址见文末。

自动追踪算法,在我们制作射击类游戏时经常会用到。这个听起来很高大上的东西,其实并不是军事学的专利,从数学上来说就是解微分方程。

这个没有点数学基础是很难算出来的。但是我们有了计算机就不一样了,依靠计算机极快速的运算速度,我们利用微分的思想,加上一点简单的三角学知识,就可以实现它。

好,话不多说,我们来看看它的算法原理,看图:

由于待会要用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),正弦对比斜,余弦邻比斜,斜边可以利用两点距离公式计算出,即:

于是

AC的长度就是导弹的速度乘以时间即 |AC|=vt,然后即可计算出AD和CD的长度,于是这一个时间片过去后,导弹应该出现在新的位置C点,他的坐标就是老的点A的x增加AD和y减去CD。

于是,新的C点坐标就是:

只要一直反复循环执行这个操作即可,好吧,为了更形象,把第一个时间片和第二个时间片放在一起看看:

第一个是时间片构造出的三角形是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))      #两点距离公式    p=velocity*time               #每个时间片需要移动的距离    sina=(y1-y)/distance    cosa=(x-x1)/distance    angle=atan2(y-y1,x-x1)              #两点线段的弧度值    x1,y1=(x1+p*cosa,y1-p*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))      #两点距离公式    p=velocity*time               #每个时间片需要移动的距离    sina=(y1-y)/distance    cosa=(x-x1)/distance    angle=atan2(y-y1,x-x1)              #两点间线段的弧度值    fangle=degrees(angle)               #弧度转角度    x1,y1=(x1+p*cosa,y1-p*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模拟导弹自动追踪的代码实例。如果文章对你有帮助,欢迎转发/点赞/收藏~
作者:半壶砂 
来源:https://www.cnblogs.com/halfsand/p/7976636.html
—END—我最近组织了一个英文图书共读营,首期读的就是一本关于 Django 3 的英文原版书。共读营原价199元,公众号读者可以限时优惠 130 元,仅需 69 元即可参与。



共读营的详细说明,可以看这篇文章:想学 Django 3 ,我该怎么办?题图:pexels,CC0 授权。

????分享、点赞、在看,给个三连击呗!???? 
使用Python来实现导弹自动追踪 自动追踪算法,在我们制作射击类游戏时经常会用到。这个听起来很高大上的东西,其实并不是军事学的专利,从数学上来说就是解微分方程。这个没有点数学基础是很难算出来的。但是我们有了计算机就不一样了,依靠计算机极快速的运算速度,我们利用微分的思想,加上一点简单的三角学知识,就可以实现它。对啦,需要原码和想学Python的小伙伴可以↓ ↓ ↓点这里呀~~ 有很多的资源可以白嫖的哈,不定时会更新一下Python的小知识的哈!!好,话不多说,我们来看看它的算法原理,看图: 由于待会要用pygame演示,它的坐标系是y轴向 阅读详情

相关推荐

Python 实现简单的导弹自动追踪

自动追踪算法,在我们设计2D射击类游戏时经常会用到,这个听起来很高大上的东西,其实也并不是军事学的专利,在数学上解决的话需要去解微分方程,   这个没有点数学基础是很难算出来的。但是我们有了计算机就不一样了,依靠计算机极快速的运算速度,我们利用微分的思想,加上一点简单的三角学知识,就可以实现它。 更多干货分享加python编程语言学习QQ群 515267276 好,话不多说,我们来看看...

weixin_44386969的博客 2021

用 Python 实现导弹自动追踪,超燃!

自动追踪算法,在我们制作射击类游戏时经常会用到。这个听起来很高大上的东西,其实并不是军事学的专利,从数学上来说就是解微分方程。

paisen110的博客 1817

会玩,有人用 Python 模拟导弹防御!

作者:半壶砂https://www.cnblogs.com/halfsand/p/7976636.html最近中|东闹得凶,除了对某色列强烈谴责,最吸引眼球的要是他们的铁穹防御系统。那如...

cainiao_python的博客 729

Python实现吃鸡游戏子弹and导弹自动追踪!原来是这样的一个原理啊!

一,前言 自动追踪算法,在我们制作射击类游戏时经常会用到。这个听起来很高大上的东西,其实并不是军事学的专利,从数学上来说就是解微分方程, 这个没有点数学基础是很难算出来的。但是我们有了计算机就不一样了,依靠计算机极快速的运算速度,我们利用微分的思想,加上一点简单的三角学知识,就可以实现它。 好,话不多说,我们来看看它的算法原理,看图: 由于待会要用pygame演示,它的坐标系是y轴向下,所以这里我们也用y向下的坐标系。 算法总的思想就是根据上图,把时间t分割成足够小的片段(比如1/1000,这

爬遍所有网站 935

铅锤面内无控飞行导弹弹道python仿真.rar

使用numpy,openpyxl,scipy,matplotlib实现铅垂面内无控飞行导弹弹道仿真,使用py可以作为openpyxl处理excel,使用scipy实现高维插值的示例程序

朝韩危机-Python模拟导弹互射

  萨德系统是麻省理工学院的林肯实验室牵头开发的。林肯实验室可以说是美军方手中的一张王牌。二个反导系统(末段高空区域导弹防御(THAAD)系统,和 国家导弹防御系统(NMD))均由实验室牵头。它既是技术支撑方,同时又是关键技术的研制方,例如THAAD地基雷达(GBR),实验室负责任务书的拟定,并负责雷达的验收,而其中的目标识别算法等又是实验室提供并负责试验数据的录取和分析。 对于在韩国部署萨德的意...

weixin_34289454的博客 428

致远OA公文管理模块相关操作

致远oa协同办公系统 公文管理模板 相关操作

weixin_59666050的博客 4278

用 Python 打造无人机战争仿真平台

智能无人机路径规划仿真系统是一个具有操作控制精细、平台整合性强、全方向模型建立与应用自动化特点的软件。它以A、B两国在C区开展无人机战争为背景,该系统的核心功能是通过仿真平台规划无人机航...

Python中文社区 2203

SNAP实战:哨兵1 SLC数据预处理全流程详解(附避坑指南)

本文详细解析了使用SNAP软件处理哨兵1号SLC数据的完整预处理流程。从轨道精校正、辐射定标到多视与斑点滤波,再到地理编码,文章提供了清晰的操作步骤与核心逻辑,并重点分享了实践中的常见“坑”与解决方案,旨在帮助用户高效、准确地完成SAR数据预处理。

7up55的博客 1029

hcaptcha无感验证码逆向实战:从接口分析到环境补全

本文详细解析了hcaptcha无感验证码的逆向实战过程。通过分析核心接口与加密逻辑,重点介绍了采用环境补全策略来模拟真实浏览器环境,从而绕过验证码检测。文章提供了从接口抓包、剖析hsw.js加密核心到使用Node.js搭建模拟环境的完整步骤,为自动化操作提供了一种稳健的解决方案。

weixin_29324401的博客 1156

Python实现的空中作战模拟器 - 探索无限可能性

Python实现的空中作战模拟器 - 探索无限可能性 去发现同类优质开源项目:https://gitcode.com/ 该项目是一个基于Python语言的空中作战模拟器,旨在提供一个互动的学习和娱乐环境,让用户通过编程的方式理解飞行战术、策略规划以及游戏开发的基本原理。 技术分析 编程语言:Python Python以其简洁明了的语法和丰富的库资源而受到广大开发者喜爱,这使得它成为快速原型设计和教...

gitblog_00026的博客 612

【STC32G12K128开发板】——搭建开发环境

Keil C251是美国Keil公司(该公司2005年被ARM公司收购)出品的针对251微控制器系列兼容单片机C语言软件开发系统。

qq_36139768的博客 1万+

用 Python 实现导弹自动追踪,超燃

自动追踪算法,在我们制作射击类游戏时经常会用到。这个听起来很高大上的东西,其实并不是军事学的专利,从数学上来说就是解微分方程。 这个没有点数学基础是很难算出来的。但是我们有了计算机就不一样了,依靠计算机极快速的运算速度,我们利用微分的思想,加上一点简单的三角学知识,就可以实现它。 好,话不多说,我们来看看它的算法原理,看图: 由于待会要用pygame演示,它的坐标系是y轴向下,所以这里我们也用y向下的坐标系。 算法总的思想就是根据上图,把时间t分割成足够小的片段(比如1/1000,这个时间片越小越精确),

Yuki1127918的博客 322

英飞凌TC377的Flash管理、UCB配置与HSM安全机制解析

本文深入解析了英飞凌TC377微控制器的Flash存储结构、UCB配置机制与HSM安全模块。详细阐述了带Cache与不带Cache的PFlash地址访问差异、利用SOTA与AB Swap实现无感OTA更新的原理,以及如何通过UCB安全配置启动流程与写保护。重点剖析了HSM硬件安全模块在密钥管理、安全启动与安全OTA中的核心作用,为开发高可靠性嵌入式系统提供实战指南。

weixin_29170327的博客 524

[网络安全提高篇] 一二〇.恶意软件动态分析经典沙箱Cape批量提取动态API特征

这是作者网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您喜欢,一起进步。前文详细介绍动态分析沙箱Cape的安装过程,其是一个开源的自动恶意软件分析系统,通过自动运行和分析恶意软件,全面分析和提取恶意软件的关键特征。然而,当样本数量增加时,单个样本分析会降低效率。这篇文章将讲解如何实现Cape沙箱的批量分析,通过调用Python脚本文件来实施批量处理,并将分析结果存储在指定位置,最后补充submit.py的参数及Python调用方式。基础性文章,希望对您有帮助!

杨秀璋的专栏 4124

python源码案例 实现简单的 “导弹” 自动追踪

python源码案例 实现简单的 “导弹” 自动追踪

m0_37302966的博客 647

vue2/3 - 详细实现高德地图轨迹回放,vue高德地图车辆历史行驶轨迹播放,在地图上绘制行程轨迹|起点和终端的路程绘制|用户运动轨迹绘制及播放等(支持开始/暂停、进度条拖放、控制播放轨迹的倍速等)

vue2,vue3,nuxt,高德地图,轨迹,vue高德地图轨迹回放,历史轨迹回放,轨迹回放功能支持倍速及进度条拖拽,VUE高德地图轨迹回放、倍速调整、进度条拖拽,vue3高德地图轨迹回放,Vue实现地图路径回放,vue中使用高德地图实现历史轨迹回放并能控制播放轨迹的倍速,多条轨迹陆续播放,巡航轨迹做带进度条和倍速的轨迹回放,Vue高德地图路径回放,历史轨迹回放并能控制播放轨迹的倍速,使用高德地图实现轨迹播放和进度条控制,vue高德地图如何实现轨迹回放,高德地图做轨迹绘制用什么api,高德轨迹API,驾车轨

✅ 精选推荐文章 1万+

python 实现一个简单的动态目标自动实时追踪

……

u013669912的博客 1361

【RH850/U2A】:功能安全

功能安全相关

3130

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

燃!Python实现导弹自动追踪

算法总的思想就是根据上图,把时间t分割成足够小的片段(比如1/1000,这个时间片越小越精确),每一个片段分别构造如上三角形,计算出导弹下一个时间片走的方向(即∠a)和走的路程(即vt=|AC|),这时候目标再在第二个时间片移动了位置,这时刚才计算的C点又变成了第二个时间片的初始点,这时再在第二个时间片上在C点和新的目标点构造三角形计算新的vt,然后进入第三个时间片,如此反复即可。旋转后的图片变成了蓝色的那个范围,根据旋转角度的不同,所变成的图片大小也不一样,我们看旋转90的情况。

m0_58477260的博客 731

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Python实现导弹自动追踪

大家好,欢迎来到 Python专栏! 自动追踪算法,在我们制作射击类游戏时经常会用到。这个听起来很高大上的东西,其实并不是军事学的专利,从数学上来说就是解微分方程。 这个没有点数学基础是很难算出来的。但是我们有了计算机就不一样了,依靠计算机极快速的运算速度,我们利用微分的思想,加上一点简单的三角学知识,就可以实现它。 好,话不多说,我们来看看它的算法原理,看图: 由于待会要用pygame演示,它的坐标系是y轴向下,所以这里我们也用y向下的坐标系。 算法总的思想就是根据上图,把时间t分割成足够.

qianfengpython的博客 497

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

上一篇: 用脚投票,Python Web 框架最新排名出炉
下一篇: 程序员如何通过被动收入实现“暴富”
codingpy
博客等级 码龄11年 1873粉丝 104原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值