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

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

前言

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。

PS:如有需要Python学习资料的小伙伴可以点击下方链接自行获取

Python免费学习资料、代码以及交流解答点击即可加入


自动追踪算法,在我们设计2D射击类游戏时经常会用到,这个听起来很高大上的东西,其实也并不是军事学的专利,在数学上解决的话需要去解微分方程,

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

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

 

 

由于待会要用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乘cosa和sina即可。

计算sina和cosa,正弦对比斜,余弦邻比斜,斜边可以利用两点距离公式计算出,即:

 

 

于是

 


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

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

 

 

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

 


第一个是时间片构造出的三角形是ABE,经过一个时间片后,目标从B点走到了D点,导弹此时在C点,于是构造新的三角形CDF,重复刚才的计算过程即可,图中的角∠b就是导弹需要旋转的角度,现实中只需要每个时间片修正导弹的方向就可以了,具体怎么让导弹改变方向,这就不是我们需要研究的问题了

好,由于最近在用Python的pygame库制作小游戏玩,接下来我们就用pygame来演示一下这个效果,效果如下图:

 

 

很简单的代码如下:

import pygame,sys
from 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=0
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)              #两点线段的弧度值
    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,sys
from 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实现简单的导弹自动追踪!此乃装逼神技!

由于待会要用pygame演示,他的坐标系是y轴向下,所以这里我们也用y向下的坐标系。 计算sina和cosa,正弦对比斜,余弦邻比斜,斜边可以利用两点距离公式计算出,即: 于是 AC的长度就是导弹的速度乘以时间即 |AC|=vt,然后即可计算出AD和CD的长度,于是这一个时间片过去后,导弹应该出现在新的位置C点,他的坐标就是老的点A的x增加AD和y减去CD。 于是,新的...

1218

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

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

爬遍所有网站 935

追踪博弈基础之导引律学习(比例导引、纯跟踪法、差分追踪)

百度百科原译:导引律( guidance law) 引导飞行器至目的点或与目标相遇的算法。按照我们常说,导引也可以叫做追踪,引导自身去追踪目标。此处的目标与自身都不限于飞行器,有无人机,无人艇,无人车,机器狗,导弹,飞机,坦克等很多对象。特别地,导引律不是无人系统的姿态控制和运动控制算法。其中:r代表了导弹和目标的相对距离,导弹和目标的连线称为目标视线。q代表了目标视线与攻击平面内某一基准线的夹角,称为目标视线方位角。V和代表了导弹速度和目标速度。σ 代表速度和基准线的夹角。

m0_52073339的博客 9452

绘制炸弹轨迹——Python实现更简单的轨迹绘制

绘制炸弹轨迹——Python实现更简单的轨迹绘制在游戏开发过程中,经常需要绘制各种炸弹或导弹的轨迹,以便玩家更好地预测爆炸范围和安全躲避。今天我们将介绍如何使用Python实现更简单的轨迹绘制,让游戏开发变得更加轻松。首先,我们需要准备一个Python绘图库,比如matplotlib。这个库非常适合用于数据可视化和图形绘制,并且提供了丰富的API和文档。接着,我们需要生成轨迹点的数据。通常,轨迹点是通过计算物体的运动轨迹得到的。对于炸弹或导弹,我们可以使用物理学公式来计算其运动状态。

持续更新 1249

vscode远程连接deepin出错:过程试图写入的管道不存在的解决方法

背景:昨天我用vscode使用ssh远程开发还处于正常状态,今天刚打开电脑,并启动deepin,再次使用vscode重新连接就出现异常。意思就是22号默认端口连接被拒绝,所以要先确定ssh是否连接。3.重新进入vscode里面,重新连接,如图成功连接。,查看port后面的端口号是不是22号。1.检查sshd是否启动。

qq_43573047的博客 2946

【蓝桥杯】【python】拦截导弹

题目描述 思路 最初我想把整体高度逆序排布为 Height[ n ] ,然后利用动态规划 创建一个列表 dp[ i ],意思是第 i 个导弹之前比它低的导弹数量 所以状态转移方程: dp[ i ] = max{dp[ j ] + 1, 1}(0 <= j < i) 最开始代码如下: Height = input().split() H = [0 for _ in range(len(Height) + 1)] dp = [0 for _ in range(len(Height) + 1)]

m0_53347750的博客 1793

Spring Boot 构建war 部署到tomcat下无法在Nacos中注册服务

因此,当使用外部容器时,如此处的 Tomcat 来部署项目,AbstractAutoServiceRegistration 就不能监听到容器启动事件了,也就不会尝试向服务注册中心注册当前这个微服务,那么注册就失败了,并且也就没有异常信息了。自定义获取获取外部容器端口的方法, 然后监听应用启动事件,当应用被启动时,获取外部容器启动的端口号,然后将这个 port 设置到 NacosAutoServiceReigistration 中。在启动类同级目录,复制下面代码即可(不需要修改,直接构建war即可)

ttyy1112的专栏 2519

自动跟踪算法笔记(1):蒙特卡洛法、推导以及MATLAB实现

文章目录

sangba2019的博客 1638

Weblogic安装与部署

27.免密登录,在目录Oracle\Middleware\Oracle_Home\user_projects\domains\base_domain\servers\AdminServer和Oracle\Middleware\Oracle_Home\user_projects\domains\base_domain\servers\Server-TA目录下,新建security\boot.properties文件,13.点击新建按钮,填写服务器名称,服务器监听地址,再点击下一步,最后点击完成。

m0_46259466的博客 6635

高速DAC时钟与配置实战:DAC5681Z硬件设计与寄存器编程详解

在高速数据转换系统中,时钟信号是决定系统性能的核心要素,其稳定性和纯净度直接影响数模转换器(DAC)的输出频谱纯度与动态范围。时钟电路的设计原理涉及信号完整性、阻抗匹配与直流偏置,而内部锁相环(PLL)和延迟锁相环(DLL)的配置则是实现精确时序控制的关键技术。这些技术的价值在于,它们共同保障了高速通信、雷达和任意波形生成等应用对信号实时性与精度的严苛要求。本文聚焦于德州仪器(TI)的DAC5681Z,深入解析其外部时钟输入电路的硬件设计要点,包括端接电阻的计算与选型,并详细拆解通过串行外设接口(SPI)对

weixin_30342363的博客 186

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

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

weixin_46417977的博客 231

【破局之道】LangChain4j 0.31.0 + Java 8 + Spring Boot:在“过时”环境中构建本地大模型应用的实战指南

本文为使用Java 8和Spring Boot等“过时”技术栈的团队提供了构建本地大模型应用的实战指南。通过采用LangChain4j 0.31.0这一兼容版本,结合Ollama部署本地大模型,开发者无需升级JDK即可在现有项目中快速集成AI能力,实现智能问答、文档摘要等功能,为传统项目注入创新活力。

t4y5u6i7o的博客 557

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

……

u013669912的博客 1361

雷达系统仿真——非相参累积和相参累积检测

非相参累积和相参累积检测 在雷达回波检测中,在特殊情况下,才会根据单个脉冲来进行检测判决。通常,雷达会从每个目标接收几个到几百个成串脉冲,在做出判决之前,要先对脉冲串进行处理。对脉冲串进行处理的方法有5种: 相参累积(Coherent Integration); 非相参累积(Nocoherent Integration); 二进制累积; 累计检测; 反馈累积器。 1 非相参累积 也叫“检波后累积”,或者“视频累积”(Video Integration),比检波前累积更容易完成,因为不需要保存回波的相位。

little_soldier的专栏 1万+

C#上位机面试必问30题:机器视觉+工业通信+性能优化(含答案解析)

工业通信:围绕“稳定性”展开,重点答异常处理、断线重连、资源释放;机器视觉:围绕“精度+速度”展开,重点答预处理、ROI、参数优化;性能优化:围绕“UI不卡、内存不泄、效率不低”展开,重点答异步、限流、资源复用;面试加分项:结合实际项目案例(如“我在XX项目中用信号量解决了多设备并发卡顿问题”)。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1509

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

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

m0_37302966的博客 647

基于Keil软件实现对射式红外传感器计次 (江协科技HAL库)

用HAL库复现江协科技,让嵌入式学习之路更顺畅。

2401_82728381的博客 798

燃!Python实现导弹自动追踪

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

m0_58477260的博客 731

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

python实现导弹追踪功能!

收藏!https://blog.youkuaiyun.com/qq_41841569/article/details/86000922 这个没有点数学基础是很难算出来的。但是我们有了计算机就不一样了,依靠计算机极快速的运算速度,我们利用微分的思想,加上一点简单的三角学知识,就可以实现它。 好,话不多说,我们来看看它的算法原理,看图:由于待会要用pygame演示,他的坐标系是y轴向下,所以这里我们也用y向下的坐...

ningngmei4328的博客 705

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Python实现导弹自动追踪

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

qianfengpython的博客 497

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

上一篇: 利用Python绘制酷炫的散点图
下一篇: 面向对象学不会看不懂?一文详解面向对象知识点总结
酸菜鱼编程
博客等级 码龄6年 155粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值