鱼雷的发射角设置

news2025/1/16 18:46:06

过年嘛 放松个五六天啥的 玩了个猎杀潜航的游戏

觉得那玩意挺有意思的

开年了 要美赛 写个设置鱼雷发射角的小程序玩玩

游戏嘛,反正大概简易版就是这个框架,自己补充呗 各种设定啥的,没怎么关心,就是总结一下里面的平面几何..水个文章玩玩

顺便练习一下pptx绘图

美赛的时候估计还是 matplotlib + origin + pptx ......

乐 大年初四滚去学习了... 可惜了 我想吃点必胜客再学习 ...... kfc也行啊

简陋的数学

  • 以潜艇为原点 以潜艇潜艇方向为x轴正方向 建立平面直角坐标系

  • 为什么设置的这么简单?

  • 因为 猎杀潜航 是个二战游戏

  • 那个点的潜艇似乎没有什么水面200米下打出鱼雷的技巧

  • 似乎也没有能智能导航的鱼雷

  • 补充一点,游戏里面的鱼雷应该是先顺着发射方向飞一段距离

  • 然后转向(有且只能转向这一次)

  • 什么 你想看博主证明这个角 那个角的旋转不变性....

  • 博主读的是物理啊...不喜欢证明这个玩意

  • 不要勾起一些难过的回忆

航线的问题

  • 首先不要因为自己的水平低而低估数学家的能力

  • 航线一般而言是确定的(省时省力)

  • 敌人最佳的攻击处与攻击时间是确定的(根据你对敌人的了解推测)

  • 护航舰队一定能针对你的弱点进行准确而高效的反鱼雷准备(你潜艇的建造技术不太可能泄漏,但是性能指标嘛,几乎是透明的,人家被你干掉那么多船,不能统计一下?)

计算AOB角

  • 游戏中,我们用声纳的两次反馈信息确定敌船的速度

  • 就是差分的思想...

计算发射角

  • 我们用t来表示鱼雷从发射到命中的时间,实际运用中这个时间的设置涉及到:

  • 撤退问题(打了就得跑啊,别人的被动声纳干啥吃的)

  • 换目标时间(打完了你得接着干人家的船啊)

  • ......

  • 总之就是个多目标优化问题 ......

  • 我们注意到,在二战的技术背景下,

  • 敌舰(merchant 商船)一般而言是不太可能做机动航行的,同时为了保证到达时间符合预期,所以它的航行看成无加速运动似乎问题不大

  • 事实上,这样的估计不可能准确

  • 鱼雷在转向前的运行速度必然是难以估测的

  • 一个正常的舰长不会在艇内把鱼雷先点了,调整好速度再打出去

  • 如果鱼雷是被爆炸药推出去的,那么这必然是个减速过程

  • 鱼雷转向时太靠近潜艇,可能会破坏潜艇本身(太小)

  • 鱼雷在完成转向后的运行速度必然是难以估测的

  • 燃料烧完了,质量减轻了,加速度变大了

  • 水文条件难以估测

水文条件

  • 我们必然是从一个超大的矩形域或圆形域来考虑这个问题的,

  • 我们不妨设水文条件对鱼雷水平运行的加速度干扰如下(水面不可能这样的啊 只是演示 只是演示)

  • 注:我们这里不考虑水雷是如何从海底80米腾飞到水面上的过程,那个技术德国二战应该还没有实现

鱼雷有限的自稳定系统

  • 虽然什么自动导航,光纤引导什么的技术是不太可能在二战时期大规模应用的

  • 但是我加一个水平偏移角探测器配合上舵机微调一下问题不大吧

同样的我们设鱼雷的自稳定系统可以提供加速度如下:

鱼雷有限的自导航系统

  • 我们不追求鱼雷八百里开外一发入魂.但是八十米的时候是不是可以安排一个磁力导航系统呢?

  • 要不然军舰的磁不白消了......

  • 这样的话,又可以提供一个加速度

鱼雷动力系统稳定性分析

  • 我们看到这一团恶心的,难以估测的一大坨,总是充满了厌恶之情...

  • 所以我们经过复杂的分析之后,得出结论

  • 贴脸输出吧,这不香吗?

  • 博主觉得这种问题知识付费一下不为过吧...

注意

  • 如果你初高中的时候没有因为 puppy love 或者别的什么而荒废的话,而且又能看到这个地方而且又玩 游戏玩得很溜的话,你就会发现,尾部鱼雷是怎么打的....这个模型似乎只适用于潜艇的某一个攻击位置啊!

  • 是的,没错,不过...

  • 我怎么知道,那又是另一个故事了...

对此..一个基于Python的小游戏

  • 比较low...主要是练练手,C++面向对象写多了怕把Python 面向对象忘光了

import numpy as np
import random as r
import matplotlib.pyplot as plt

class ship():
    #status1 二维位置 二维速度 二维加速度
    #status2 舰艇长度 舰艇宽度 
    
    def __init__(self,status1,status2):
        self.status1 = status1
        self.status2 = status2
    

class submarine():
    global SHIPS
    global SUBMARINES
    global TORPEDOES
    
    #status1 二维位置 二维速度 二维加速度
    #status2 舰艇长度 舰艇宽度
    #status3 L1 theta2    该参数组为传入鱼雷参数组
    
    def __init__(self,status1,status2):
        self.status1 = status1
        self.status2 = status2
        
    def fire_torpedo(self,status3):
        createvar = locals()
        V1 = 80
        L1 = 100

        num = "t_"+str(round(random.random()*100000))
        createvar[num] = torpedo(status3)

        status1 = np.zeros(4)
        status1[0],status1[1] = self.status1[0],self.status1[1]

        #计算速度
        v1,v2 = self.status1[2],self.status1[3]
        Vx = V1 * (v1)/(v1**2+v2**2)**0.5
        Vy = V1 * (v2)/(v1**2+v2**2)**0.5
        status1[2],status1[3] = Vx,Vy

        num.status1 = status1
        TORPEDOES.append(num)
        
    def sonar(self):
        sonar_range = 10000
        x,y = self.status1[0],self.status1[1]
        SIGNAL = [] 
        for i in SHIPS:
            d = (x-i.status1[0])**2+(y-i.status1[1])**2            
            if sonar_range**2 >= d:

                #模块化计算a
                part1 = np.arctan(self.status1[1]/self.status1[0])
                part2 = np.arctan((i.status1[1]-y)/(i.status1[0]-x))
                a = np.pi - part1 - part2
                SIGNAL.append(np.array([d,a]))

        print(SIGNAL)    
        return SIGNAL


class torpedo():
    #status1 二维位置 二维速度
    #status2 长度 宽度
    #status3 L1 theta2    该参数组为传入鱼雷参数组
    def __init__(self,status1,status3):
        self.status1 = status1
        self.status3 = status3
    

def run():
    global SHIPS
    global SUBMARINES
    global TORPEDOES
    global dt
    for ship in SHIPS:
        #更新位置
        ship.status1[0] += dt * ship.status1[2] 
        ship.status1[1] += dt * ship.status1[3]
        ship.status1[0] += dt**2 * ship.status1[4]
        ship.status1[1] += dt**2 * ship.status1[5]

        #更新速度
        ship.status1[2] += dt * ship.status1[4]
        ship.status1[3] += dt * ship.status1[5]

    for ship in SUBMARINES:
        #更新位置
        ship.status1[0] += dt * ship.status1[2] 
        ship.status1[1] += dt * ship.status1[3]
        ship.status1[0] += dt**2 * ship.status1[4]
        ship.status1[1] += dt**2 * ship.status1[5]

        #更新速度
        ship.status1[2] += dt * ship.status1[4]
        ship.status1[3] += dt * ship.status1[5]

    for ship in TORPEDOES:
        #更新位置
        ship.status1[0] += dt * ship.status1[2] 
        ship.status1[1] += dt * ship.status1[3]
        ship.status1[0] += dt**2 * ship.status1[4]
        ship.status1[1] += dt**2 * ship.status1[5]


def bomb():
    global SHIPS
    global SUBMARINES
    global TORPEDOES

    for tor in TORPEDOES:
        for ship in SHIPS:
            xt,yt = tor.status1[0],tor.status1[1]
            xs,ys = ship.status1[0],ship.status1[1]
            tol = 1
            if (xt-xs)**2 + (yt-ys)**2 <= 1:
                print("BOMB!")
                SHIPS.remove(ship)
                TORPEDOES.remove(tor)


def calculate_theta1(signal1,signal2):
    d1,a1 = signal1
    d2,a2 = signal2
    d3 = d1**2+d2**2-2*d1*d2*np.cos(a1-a2)

    #theta1 模块化计算
    part1 = d1**2+d3**2-d2**2
    part2 = 2*d1*d3

    print(np.arccos(part1/part2))
    return np.arccos(part1/part2)
    
def calculate_theta2(Datapack):
    #L1 = 100
    #L2,V1,V2,V3,t,theta1
    
    L1,L2,V1,V2,V3,t,theta1 = Datapack

    #theta2 模块化计算
    part1 = (L1**2-L2**2)+V3**2*t**2
    part2 = -V2**2*(t-L1/V1)**2
    part3 = -2*L1*V3*t*np.cos(theta1)
    part4 = 2*L2*V2*(t-L1/V1)
    part5 = (part1+part2+part3)/part4
    theta2 = np.arccos(part5)
    
    return np.array([L1,theta2])


def Plot(Time):
    global SHIPS
    global SUBMARINES
    global TORPEDOES

    fig = plt.figure(figsize=(12,6))
    ax1 = plt.subplot(121)
    for i in SUBMARINES:
        ax1.scatter(i.status1[0],i.status1[1],s=4,c="blue")
    for i in TORPEDOES:
        ax1.scatter(i.status1[0],i.status1[1],s=2,c="yellow")

    plt.grid()

    
    ax2 = plt.subplot(122)
    for i in SUBMARINES:
        ax2.scatter(i.status1[0],i.status1[1],s=4,c="blue")
    for i in TORPEDOES:
        ax2.scatter(i.status1[0],i.status1[1],s=2,c="yellow")
    for i in SHIPS:
        ax2.scatter(i.status1[0],i.status1[1],s=8,c="red")

    plt.grid()
    plt.savefig(str(round(Time,2))+".jpg")
    #plt.pause(0.02)
    plt.cla()
    
if __name__ == "__main__":
    ship1 = ship(np.array([300,700,2,2,0,0]),np.array([130,35]))
    SHIPS = [ship1]

    submarine1 = submarine(np.array([500,200,4,2,0,0]),np.array([38,7]))
    SUBMARINES = [submarine1]

    TORPEDOES = []
    Time = 0
    dt = 5
    while Time<1000:
        run()
        bomb()
        Plot(Time)
        Time += dt
        while input("go or not")=="go":
            #try:
                eval(input())
            #except:
            #    print("wrong")
            #    continue

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/178348.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

30. PyQuery: 基于HTML的CSS选择器

目录 前言 导包 基本用法 按标签选择 标签链式操作 简便链式&#xff1a;后代选择器 类选择器 id 选择器 属性/文本选择器&#xff08;重点&#xff09; 改进多标签拿属性方法 快速总结 PyQuery的强大功能&#xff1a;修改源代码 添加代码块 修改/添加属性 删…

java spring IOC xml方式注入(数组 list集合 map集合 set集合)类型属性

我们先创建一个基本的java项目 然后引入 spring 的基本依赖 然后在src下创建一个包 我这里叫 collectiontype 和我同名 会避免一些找不到资源的麻烦 毕竟说 你们开发代码大部分会在这篇文章拿过去 当然 名称是看自己去取的 只是和我同名会方便一些 直接复制过去就好了 然后在…

C语言函数定义

函数是一段可以重复使用的代码&#xff0c;用来独立地完成某个功能&#xff0c;它可以接收用户传递的数据&#xff0c;也可以不接收。接收用户数据的函数在定义时要指明参数&#xff0c;不接收用户数据的不需要指明&#xff0c;根据这一点可以将函数分为有参函数和无参函数。将…

ARP渗透与攻防(七)之Ettercap Dns劫持

系列文章 ARP渗透与攻防(一)之ARP原理 ARP渗透与攻防(二)之断网攻击 ARP渗透与攻防(三)之流量分析 ARP渗透与攻防(四)之WireShark截获用户数据 ARP渗透与攻防(五)之Ettercap劫持用户流量 ARP渗透与攻防(六)之限制网速攻击 ARP-Ettercap Dns劫持 1.什么是DNS 1.概念 DNS是D…

汇编语言学习 下

本文承接汇编语言学习笔记 上 上篇文章记录了汇编语言寄存器&#xff0c;汇编语言基本组成部分&#xff0c;数据传送指令&#xff0c;寻址指令&#xff0c;加减法指令&#xff0c;堆栈&#xff0c;过程&#xff0c;条件处理&#xff0c;整数运算的内容 高级过程 大多数现代编程…

通信原理简明教程 | 信号、信道与噪声

文章目录1 信号与系统的基本概念2 傅里叶变换与信号的频谱2.1 信号的频谱2.2 傅里叶变换的常用性质2.3 信号的能量谱、功率谱与自相关函数2.4 信号的带宽3 线性系统与滤波器3.1 线性系统及其频率特性3.2 系统响应的频域求解3.3 滤波器2.4 信道及其特性4.1 信道的分类4.2 信道的…

兔年伊始谈闲书:三体-乌合之众-百年孤独 和《猫城记》(随笔)

引言 “ 各位读者&#xff0c;我们都兔年大吉&#xff0c;新春快乐。我本想写一篇《公有云换帅转舵后的错误经验和正经歪念》&#xff0c;但刚过年就炮火味十足&#xff0c;觉得有失体面。所以就写了篇读书的散记杂记。本文和云计算行业完全无关&#xff0c;就是一个有常识性阅…

[数据结构基础]排序算法第一弹 -- 直接插入排序和希尔排序

一. 排序的概念及分类 1.1 排序的概念 排序&#xff0c;就是使一串数据&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 1.2 常见的排序算法 图1.1按照排序算法的思想&#xff0c;将排序分为四大类&#xff1a;插入排序、选择排序…

OpenGL相关库及其关系概述

目录 1、OpenGL 2. .GLUT 3、Freeglut 4、glew 5、glfw 6、glad 1、OpenGL OpenGL只有框架没有实现&#xff0c;换句话说就是OpenGL只有函数声明没有源文件实现&#xff0c;类似于接口和虚函数。所有的实现是显卡生产商提供。比如NVIDIA或者AMD就要自己实现OpenGL函数内容…

前后端登录逻辑讲解-本文使用RSA加密过程-附代码

文章目录一、项目环境二、生成公钥私钥1.生成私钥2.查看私钥3.生成公钥4.查看公钥三、安装依赖包四、自测加解密1.纯前端自测2.前后端联调①前端登录代码改为&#xff1a;②后端登录接口代码&#xff1a;③验证五、与数据库密码进行对比&#xff08;数据库是进行了bcryptjs加密…

关于非授权访问的逻辑漏洞挖掘

简介 挖洞的时候日常笔记&#xff0c;很多细节都写得不好&#xff0c;师傅们不要介意 开始 获取目标&#xff1a;https://fofa.info/ 在fofa上输入body“后台登录”&#xff0c;可以看到一大堆目标&#xff0c;今天我打算去测试逻辑漏洞 进入目标地址 随意输入用户名和密码&…

Python LC Loan贷款数据集 统计分析 数据挖掘 研究报告

实验代码&#xff1a;https://download.csdn.net/download/Amzmks/87396462 首先读表 将有空值的列和完全相同的列删除 将数值型数据单独挑出来 将数值型数据从string转为float 用方差阈值法筛选特征较为明显的部分数值型数据 将文本型数据单独挑出来 去除所有的可能的头…

计算机存储系统

前言何为存储系统&#xff1f;存储系统是指计算机中由存放程序和数据的各种存储设备、控制部件及管理信息调度的设备&#xff08;硬件&#xff09;和算法&#xff08;软件&#xff09;所组成的系统。为何需要存储系统&#xff1f;信息是人类认知外界的方式&#xff0c;最初的信…

对CAS的理解

CAS的概念&#xff08;compare and swap&#xff09;:比较并交换我们首先要明白&#xff0c;自旋是一个纯用户态的操作&#xff0c;本身并没有进行加锁&#xff0c;所执行的代码&#xff0c;是在并发环境下执行的&#xff0c;没有锁。我们举一个例子来说明自旋加CAS的作用&…

Day05 C++STL入门基础知识三——String容器(上)概念-构造-赋值-拼接-查找-替换【全面深度剖析+例题代码展示】

文章目录1. 基本概念1.1 本质1.2 string与char*的区别1.3 特点2. 构造函数2.1 四种构造2.2 举例展示3. 赋值操作3.1 七种赋值函数原型&#xff08;operator等号赋值/assign成员函数赋值&#xff09;3.2 举例展示4. 拼接操作4.1 七种拼接函数原型4.2 举例展示5. 查找操作5.1 八种…

分布式概念

目录一、什么是分布式二、分布式与集群的关系三、软件架构演变四、RPC是什么1.RPC思想原理2.服务之间的交互可以用两种方式五、分布式思想与基本概念1.高并发2.高可用3.注册中心4.负载均衡5.服务雪崩6.熔断7.限流8.API网关9.服务跟踪10.弹性云一、什么是分布式 《分布式系统原…

Python流程控制语句之循环语句

上一篇&#xff1a;Python流程控制语句之选择语句 文章目录前言一、while 循环二、for 循环1. 进行数值循环2. 遍历字符串三、循环嵌套总结前言 生活中很多问题都无法一次解决&#xff0c;就像谚语所说&#xff1a;罗马不是一天建成的。一些事物必须周而复始地运转才能保证其存…

linux并发控制详解

目录 1.并发控制 1.1.并发概念 1.2.并发问题 2.多CPU核心 3.解决 4.中断屏蔽 5.原子操作 6.自旋锁 7.自旋锁衍生读写自旋锁 7.1.自旋锁与读写自旋锁的对比&#xff1a; 8.读写自旋锁衍生顺序锁 9.RCU 10.信号量 11.互斥体&#xff08;互斥锁&#xff09; 11.1.互…

2023起点上,一段迷茫的自我倾诉

大家新年快乐。 回顾记忆中渐渐远去的2022。 我曾想象随着一年过去我就能取得很大的进步&#xff0c;“彻底”改变自己的生活状态。其实不过幻想罢了&#xff0c;人才不会无缘无故进步呢。 我曾一度沉溺于网络世界中的关注&#xff0c;想象着自己将可以取得一些成就&#xff…

【每日一道智力题】三个火枪手(快来看人生哲理)

&#x1f680;write in front&#x1f680; &#x1f4dc;所属专栏&#xff1a; &#x1f6f0;️博客主页&#xff1a;睿睿的博客主页 &#x1f6f0;️代码仓库&#xff1a;&#x1f389;VS2022_C语言仓库 &#x1f3a1;您的点赞、关注、收藏、评论&#xff0c;是对我最大的激励…