清华在校生呕心沥血,终于利用python编程完美解释导入追踪原理

0009-利用setMouseCallback函数实现鼠标对图片窗口的操作 本程序实现鼠标对图片窗口的操作。 本程序利用setMouseCallback函数将图像窗口与对应的鼠标处理函数映射起来!在这个程序中: ①当鼠标左键在图像上某点点击时,显示这个点的坐标,并在图像上该点处划圆; ②当鼠标左键没有按下时,鼠标移动时,则会显示鼠标所在点的实时坐标; ③当鼠标左键按下不放并且鼠标移动时,则在图像上划矩形,当鼠标放开后,则会把相应的矩形区域提取出来显示在另一个窗口中。程序... 阅读详情

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

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

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

由于待会要用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,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)

所以最后我们加入相关算法代码,效果就比较完美了

大功告成,最后附上全部的算法代码以上便是用Python模拟导弹自动追踪的代码实例。

以上便是用Python模拟导弹自动追踪的代码实例。

学习交流:

①Python电子书有

②Python开发环境安装教程有

③Python视频有

④软件开发常用词汇有

⑤Python学习路线图有

⑥项目源码案例分享有 如果你用得到的话可以直接拿走,在我的QQ技术交流Q群里

群号:200160592

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?机器学习?数据分析?爬虫? 在找到一本Python书籍之前,一定要问问自己为什么要学习Python? Python在这近几年里面越来越受追捧,很多的同学小伙伴都想用Python来提升自己的技能 这是一件非常好的事情,但是问题在于很多的人都不知道学Python要做些什么,所以有什么长篇大论的都去看,非常容易产生不好的兴趣,很容易陷入学不下去的困境。 必须要有针对性,选择性的去学习,并且针对性学习的宗旨是按照自己的需要去学,学以致用。 想成为木匠,才要去学习用刨子,车床,一个 阅读详情

相关推荐

python控制键盘打造梦西游

当我造梦西游4打到朱电之后,装备的合成都要依靠材料,等级也上升很慢,重复机械的刷级和刷材料就变得很烦,于是就想到了写一个Python的代码来帮助实现这些动作 pipinstall基本的库就直接能使用了! 好像这里只能放已上传的视频 http://www.longsong.online/wp-content/uploads/2022/02/QQ%E5%BD%95%E5%B1%8F20220208214923.mp4http://www.longsong.online/wp-content/upload.

long_songs的博客 1346

基于Pygame中Pygame模块的大战外星人

需要自行安装Pygame(必须)和Python(必须)。 由于多次引用背景参数,建议不要更改文中的背景参数。本文中的图片用的是相对引用的方式,如果和我图片位置放置不同的话需要设置绝对引用。 主要代码片段: import sys import pygame # 调用pygame from settings import Settings # 背景和一些必要值 from ship import Ship # 飞船个人设置 import game_function as gf #

qq_60441875的博客 3783

基于 Python-pygame 的导弹自动追踪代码实现与详细讲解(不考虑弹头,只考虑导弹本身)

基于 Python-pygame 的导弹自动追踪代码实现 自动追踪算法,其实就是解微分方程,利用微分的思想,加上一点简单的三角学知识,就可以实现它。 算法总的思想就是根据上图,把时间t分割成足够小的片段(比如1/1000,这个时间片越小越精确),每一个片段分别构造如上三角形,计算出导弹下一个时间片走的方向(即∠a)和走的路程(即vt=|AC|),这时候目标再在第二个时间片移动了位置,这时刚才计算的C点又变成了第二个时间片的初始点,这时再在第二个时间片上在C点和新的目标点构造三角形计算新的vt,然后进入第三个

Eric005的博客 1208

Python音视频开发:消除抖音短视频Logo和去电视台标的实现详解

详细介绍了消除视频Logo图标的几种方法以及涉及的背景知识,并提供了一套Python+Moviepy+OpenCV实现的完整的消除视频Logo的代码。

老猿Python 2527

【实战揭秘】高胜率集合竞价抓涨停策略:融合MACD背离与斐波那契的量化模型

本文揭秘了一种高胜率集合竞价抓涨停策略,融合MACD背离与斐波那契数列的量化模型。通过量能异动、技术形态突破和资金共识形成的交叉验证,该策略在实盘中表现出色。文章详细解析了MACD背离的量化实现细节、斐波那契数列的实战应用,以及策略的量化建模过程,帮助投资者提升交易胜率。

herb5的博客 1562

鼠标动作监听类MouseListener

<span style="font-size:14px;">import java.awt.event.ActionEvent ; import java.awt.event.ActionListener ; import java.awt.event.WindowListener ; import java.awt.event.WindowAdapter ; im...

weixin_30945039的博客 398

别再手动挂载NPU了!手把手教你用Ascend-Docker-Runtime一键启动昇腾AI容器

本文详细介绍了如何使用Ascend-Docker-Runtime一键启动昇腾AI容器,大幅简化NPU设备挂载流程。通过环境变量ASCEND_VISIBLE_DEVICES,开发者可以灵活指定NPU设备,提升开发效率。文章还提供了安装配置指南、高级使用技巧和常见问题排查方法,帮助开发者快速掌握这一高效工具。

weixin_42662605的博客 253

python鼠标事件_在Python类中使用鼠标事件回调

我想写一个程序,它以最简单的形式打开一个窗口,显示使用OpenCV捕获的网络摄像头,并打印鼠标光标在终端窗口上的坐标。为此,我想使用回调函数。我的问题是这个回调函数似乎没有运行。运行程序时不会收到任何错误消息,但当我将光标悬停在相机窗口上时,似乎什么也不会发生。我怀疑这可能是因为我的回调函数在类回调中,cv.SetMouseCallback不能访问它或其他东西。我对OpenCV和回调函数都不熟悉,...

weixin_39770592的博客 433

VMware Workstation Pro 17 最新破解版安装教程(附永久激活密钥)

本文详细介绍了VMware Workstation Pro 17专业版的安装与配置指南,包括系统要求检查、官方版本安装流程、高级配置优化及常见问题排查。通过合规使用官方版本,开发者可以充分利用其强大的虚拟化能力,提升多平台开发与测试效率。

weixin_29327977的博客 3555

2024最新超详细无痛安装PyTorch,包括下载地址、环境配置与各种避坑指南

PyTorch更新很快,2024最新下载安装经验贴,包括anaconda+CUDA+cuDNN+PyTorch四部分的下载和安装。文章详细介绍了下载地址、环境配置、虚拟环境建立的问题,还温馨提示了各种闭坑指南。有需要的友友快过来康康!

qq_43596278的博客 11万+

python代码物理_Python 愤怒的小鸟代码实现:物理引擎pymunk使用

游戏介绍最近比较忙,周末正好有时间写了python版本的愤怒的小鸟,使用了物理引擎pymunk,图片资源是从github上下载的,实现了一个可玩的简单版本。功能实现如下:支持小鸟类型:红色小鸟,蓝色小鸟,黄色小鸟。支持障碍物的类型:玻璃,木头,石头。支持障碍物的形状:各种长度的长方形,正方形和圆形。使用json文件保存关卡信息,设置小猪和障碍物的位置。游戏截图如下:图2图3完整代码游戏实现代码的g...

weixin_39550587的博客 486

利用Nginx反向代理实现GitLab自定义域名的高效配置

本文详细介绍了如何利用Nginx反向代理实现GitLab自定义域名的高效配置。通过统一域名管理、性能优化和安全加固,提升GitLab的访问效率和安全性。文章包含前期准备、GitLab基础配置、Nginx反向代理设置及常见问题排查,帮助开发者快速完成部署。

weixin_28834169的博客 164

太强了,手撸一款导弹跟踪算法(Python版)

作者:半壶砂https://www.cnblogs.com/halfsand/p/7976636.html这里涉及拦截导弹的自动跟踪。最近,看到了一个挺有趣的自动跟踪算法,一个Pyth...

zandaoguang的博客 1300

第6章: MMU Notifier在KVM虚拟化中的应用

本文分析了KVM如何利用MMU Notifier机制维护客户机与宿主机地址映射一致性。KVM采用三层地址空间转换架构(GVA→GPA→HPA),通过硬件辅助虚拟化(EPT/NPT)实现高效转换。重点探讨了KVM MMU Notifier回调实现,包括invalidate_range_start/end等核心函数,以及HVA范围处理流程。当宿主机内存变化时,KVM通过注册的notifier回调及时更新映射关系,确保虚拟化环境的内存一致性。文章详细解析了相关数据结构和关键代码实现,揭示了KVM内存管理的核心机制

图形/计算GPU的驱动与虚拟化技术分享园地 2324

【漏洞复现】爱数云盘 Usrm_GetAllUsers 未授权访问漏洞

爱数 AnyShare存在未授权漏洞,未授权的攻击者可以通过该漏洞获取用户名信息。

qq_67810151的博客 3121

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

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

cainiao_python的博客 729

Unity零基础到入门 ☀️| 【UI系统学习】轻松学会 Unity 的 UGUI基础控件的使用(包括一个简易血条、蓝条设计)

Unity,UGUI。本篇博客来挑几种Unity中最常用的UI控件如何使用和使用技巧,包括一个简易血条蓝条的小实例

努力前行,总会成为自己心中的那道光 2万+

python-opencv 鼠标回调函数 cv2.setMouseCallback()

cv2.setMouseCallback(winname, onMouse, userdata=0) winname: 自定义的窗口名 onMouse:鼠标事件的回调函数(在发生鼠标事件时执行) userdata:传递给回调函数的可选参数 onMouse函数: onMouse 是鼠标事件回调函数的默认原型,可自定义其函数名和函数内容,参数一般默认为 onMouse(event, x, y, flags, param) event:cv2_EVENT_* (M...

weixin_52994850的博客 8306

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

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

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Python高级编程

Python高级编程 复制这段内容后打开百度网盘App,操作更方便哦。 链接:https://pan.baidu.com/s/1QDXsI-j7U4rzZ0VhQXWgvA 提取码:jbq9–来自百度网盘超级会员V1的分享

m0_54907397的博客 224

visio安装包

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

python编程第四版_清华编程教授强力推荐《Python编程》,指导你如何学习python

Python编程真的那么容易吗?仅仅是看理论就可以学以致用吗?今天我给你介绍的这本书,也许会让你开始改变这种想法,因为这本书上的练习和案例以及指导本身就足够学好Python了。清华编程教授强力推荐《Python编程》,指导你如何学习python这本书的名字叫《Python编程》,对,很直白,就讲Python编程,没有篇幅巨长的理论介绍,只有足够的实战指导、案例参考、以及足够的Python工具和新出...

weixin_39835792的博客 134

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Python实现人机中国象棋游戏

特别鸣谢以下更多python教程请到友情连接: 菜鸟教程https://www.piaodoo.com 初中毕业读什么技校 http://cntkd.net茂名一技http://www.enechn.comppt制作教程步骤 http://www.tpyjn.cn 兴化论坛http://www.yimoge.cn 电白论坛 http://www.fcdzs.com永城信息港 http://www.1l4u.com茂名一技有什么专业 http://www.jeob.cn茂名市高级技工学校 http://

菜鸟教程 3860

python秒表小项目_【项目】利用Python实现自动扫雷小项目

来源:https://www.cnblogs.com/chestnut-egg/p/9302238.html自动扫雷一般分为两种,一种是读取内存数据,而另一种是通过分析图片获得数据,并通过模拟鼠标操作,这里我用的是第二种方式。一、准备工作1.扫雷游戏我是win10,没有默认的扫雷,所以去扫雷网下载http://www.saolei.net/BBS/2.python 3我的版本是 pyth...

weixin_35968572的博客 182

Python实现导弹自动追踪

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

qianfengpython的博客 497

python制图鼠标和坐标隔得远_python opencv鼠标事件实现画框圈定目标获取坐标信息...

本文实例为大家分享了python-opencv鼠标事件画框圈定目标的具体代码,供大家参考,具体内容如下在视频/相机中,用鼠标画矩形框,圈定目标,从而获得鼠标的起始坐标点a、终止坐标点b# -*- coding: utf-8 -*-"""Created on Tue Dec 27 09:32:02 2016@author: http://blog.youkuaiyun.com/lql0716"""import ...

weixin_39677419的博客 325
上一篇: 简单又实用的高级技巧,一篇文章带你深入了解Python自动化控制手机!
下一篇: Python制作游戏原来这么简单,手把手教你制作拼图类益智游戏
Python编程_可乐
博客等级 码龄6年 917粉丝 100原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值