python 根据“靶点坐标”反求“炮管抬升角度”并绘制“轨迹线”

 直接先放代码(在pyCharm中编写并运行,需要导入数学库随机库和图表库)

import math         # 数学库
import random
import matplotlib.pyplot as plt         # 图表库

# 绘图属性设置
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.title('斜抛轨迹')       # 标题
plt.xlabel("水平距离/m")    # x轴标签
plt.ylabel("垂直距离/m")    # y轴标签
plt.xlim(0, 45)           # x轴数值范围
plt.ylim(0, 25)           # y轴数值范围


def ShowTrack(v0, angle, x_target, y_target):           # 根据角度和初速绘制炮弹轨迹线
    g = 9.788  # 广州重力加速度
    v0x = v0 * math.cos(angle * math.pi / 180)  # 初速水平分量
    v0y = v0 * math.sin(angle * math.pi / 180)  # 初速竖直分量
    t = v0y / g  # 炮弹达到最高点所用时间
    T = 2 * t  # 射时
    # Sy = v0y * T - g * t ** 2 / 2
    Sx = v0x * T

    # 离散斜抛曲线
    N = 1000
    x = []
    y = []
    for i in range(N):
        now_t = T * i / (N-1)
        h = v0y * now_t - (g * now_t ** 2) / 2
        s = v0x * now_t
        x.append(s)
        y.append(h)

    # 画散点图
    plt.scatter(x, y, s=0.5, alpha=0.5)             # 绘制轨迹
    plt.scatter(x_target, y_target, s=10, alpha=1)   # 绘制靶子
    plt.draw()


def CoordinateToAngle(x, y, v0, g):        # 根据靶坐标算出炮管仰角
    a = g * x**2    # 一元二次方程a、b、c系数
    b = -2 * v0**2 * x
    c = g * x**2 + 2 * y * v0**2

    delta = b**2 - 4 * a * c    # δ = b^2 - 4ac
    if delta < 0:
        print('方程delta为 %lf ,方程无解' % delta)
        return -1, -1
    else:   # 如果δ不小于0,方程有一个或两个根
        tana = (-b + math.sqrt(delta)) / (2 * a)    # 一元二次求根公式
        angle1 = math.atan(tana) * 180 / math.pi    # 反三角函数求角

        tana = (-b - math.sqrt(delta)) / (2 * a)
        angle2 = math.atan(tana) * 180 / math.pi
        print('angle1 %lf°  angle2 %lf°' % (angle1, angle2))

        return angle1, angle2


v0_set = 20
while 1:
    x_set = random.uniform(0.1, 100)    # 随机生成靶点坐标
    y_set = random.uniform(0.1, 100)
    print('x_set %lfm  y_set %lfm' % (x_set, y_set))
    angle1_get, angle2_get = CoordinateToAngle(x_set, y_set, v0_set, 9.788)    # 根据靶点坐标算出炮管仰角
    if angle1_get > 0 and angle2_get > 0:       # 当角度值有效时才执行绘图
        ShowTrack(v0_set, angle1_get, x_set, y_set)
        ShowTrack(v0_set, angle2_get, x_set, y_set)
        # plt.show()
        plt.pause(1)
    print('')

 

  • 运行结果:

 

  • 物理示意图:

 

 

  • 炮弹轨迹为斜抛运动,斜抛运动方程:

 

  • 转为一元二次方程:

(用 1+tan^2α = 1/cos^2α 可以将公式中的三角函数都转为tanα)

 

参考资料:

1.360doc:实现火炮自动弹道计算

2.百度百科:斜抛运动

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【为什么学习这门课程】 人工智能课最怕听不懂、太枯燥、全是理论学完了不会用!本门课程以生活案例驱动知识讲解,手把手实战带你掌握AI工具,兼顾不同基础的学员,为你学习机器学习扫除障。 赵老师在对比国内外各类人工智能课程后,结合不同行业技术落地应用经验,从内容安排、知识点讲解、案例选择、学习资料等模块对课程进行设计与优化,致力于打造一门人工智能学习的必修课。 通过本门课程,同学将全面了解机器学习,掌握其核心技术并实现综合能力提升。    1、对于没有太多计算机基础或工科基础的同学,你将懂得如何使用AI这个强大的工具,并将其赋能于生活和工作中解决实际问题、实现升职加薪;    2、对于就读相关专业的同学,老师将帮你梳理知识点、构建知识体系,并为你的毕业设计提供指导建议;    3、对于从事相关行业工作的同学,老师还将与你探讨综合实战项目开发要点,让你的模型表现更出色! 【讲师介绍】 赵辛 人工智能算法科学家、福布斯中国科技榜U30(CSDN唯一一位)、澳大利亚新南威尔士大学全奖博士 【课程特色】1、课程设计:课程中涉及到的项目全部源自生活案例,内容全面、易懂,采用现实案例+知识干货+手把手实战的方式,实现人工智能的知识入门与综合提升;2、知识层面:覆盖主流技术,侧重技术应用与核心原理,易于理解;3、案例丰富:知识讲解部分基于现实案例,实现与生活紧密结合;实战部分案例亦从生活出发,区别于市场上用烂了的相似案例;4、配套资料:学员专享,老师专门整理了丰富的学习资料,并且会长期更新5、名师讲解:讲师为福布斯中国2019年科技榜U30上榜者(CSDN唯一一位))  【手把手带你实战,实战项目全部源自生活案例】 【带你了解课程的整个知识体系】 
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值