当前位置: 首页 > news >正文

使用 Python 模拟光的折射,反射,和全反射

在这里插入图片描述

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。
🍎个人主页:Java Fans的博客
🍊个人信条:不迁怒,不贰过。小知识,大智慧。
💞当前专栏:Java案例分享专栏
✨特色专栏:国学周更-心性养成之路
🥭本文内容:使用 Python 模拟光的折射,反射,和全反射

文章目录

    • 前言
    • 实现步骤
    • 代码大纲
    • 具体代码实现
    • 代码解释
    • 动态更新
    • 参考文献
    • 总结

在这里插入图片描述

前言

  光的折射、反射和全反射是光学中非常重要的现象,它们在我们日常生活中随处可见,也在许多科学和工程应用中起着关键作用。通过使用 Python 编程模拟这些现象,我们可以更好地理解光在不同介质中传播时的行为,以及为什么光线会以特定的方式反射或折射。在这个项目中,我们将探索光的基本性质,并通过编写代码来模拟光线在不同介质中的传播路径,以及如何计算折射角和反射角。通过这个实践,我们可以加深对光学原理的理解,并学习如何利用计算机模拟和分析复杂的光学现象。让我们开始这个充满挑战和乐趣的项目吧!

实现步骤

要实现这个目标,我们可以按照以下步骤来操作:

  • 1、导入必要的库:首先,我们需要导入matplotlib库用于图形绘制,以及numpy库用于数学计算。你可以使用以下代码导入这两个库:
import numpy as np
import matplotlib.pyplot as plt

  计算反射角和折射角:根据斯涅尔定律,我们可以使用以下公式计算折射角

n1 × sin(thetai)=n2×sin(thetat)

其中,n1和n2分别是两种介质的折射率,thetati是入射角,thetat是折射角。根据反射定律,反射角等于入射角。

  • 2、绘制光线路径:根据计算出的角度,我们可以绘制入射光线、反射光线和折射光线。你可以使用matplotlibplot函数来绘制直线,设置不同的颜色表示不同的光线。

  • 3、动态调整:你可以编写一个交互式的程序,通过用户输入不同的折射率和入射角,实时更新图形。可以使用matplotlibinteractive模式或者结合input函数来实现用户输入。

  通过以上步骤,我们可以实现一个简单的光线折射、反射的模拟程序,并且可以通过用户输入动态调整光线的路径和角度。

代码大纲

  • 导入必要的库:
import numpy as np
import matplotlib.pyplot as plt
  • 定义计算函数:
def calculate_angles(n1, n2, theta_i):# 计算折射角theta_t = np.arcsin(n1*np.sin(theta_i)/n2)# 计算反射角theta_r = theta_ireturn theta_r, theta_t
  • 绘制初始图形:
# 绘制入射光线
plt.plot([0, np.cos(theta_i)], [0, np.sin(theta_i)], label='Incident Ray')# 绘制反射光线
plt.plot([0, -np.cos(theta_r)], [0, np.sin(theta_r)], label='Reflected Ray')# 绘制折射光线
plt.plot([0, np.cos(theta_t)], [0, -np.sin(theta_t)], label='Refracted Ray')plt.axis('equal')
plt.legend()
plt.show()
  • 动态更新图形:
# 获取用户输入的折射率和入射角
n1 = float(input("Enter the refractive index of the first medium: "))
n2 = float(input("Enter the refractive index of the second medium: "))
theta_i = float(input("Enter the incident angle in radians: "))# 计算角度
theta_r, theta_t = calculate_angles(n1, n2, theta_i)# 清除之前的图形
plt.clf()# 重新绘制光线
plt.plot([0, np.cos(theta_i)], [0, np.sin(theta_i)], label='Incident Ray')
plt.plot([0, -np.cos(theta_r)], [0, np.sin(theta_r)], label='Reflected Ray')
plt.plot([0, np.cos(theta_t)], [0, -np.sin(theta_t)], label='Refracted Ray')plt.axis('equal')
plt.legend()
plt.show()

  通过这个代码框架,你可以实现一个简单的光线折射、反射模拟程序,并且可以根据用户输入动态更新图形。

具体代码实现

import numpy as np
import matplotlib.pyplot as plt# 定义计算反射角和折射角的函数
def calculate_angles(n1, n2, theta_i):# 计算反射角theta_r = theta_i# 计算折射角theta_t = np.arcsin(n1 * np.sin(theta_i) / n2)return theta_r, theta_t# 绘制光线路径
def plot_rays(n1, n2, theta_i):# 计算角度theta_r, theta_t = calculate_angles(n1, n2, theta_i)# 转换为度数theta_i_deg = np.degrees(theta_i)theta_r_deg = np.degrees(theta_r)theta_t_deg = np.degrees(theta_t)# 绘制界面plt.figure(figsize=(10, 5))plt.axhline(0, color='black', linewidth=2)# 绘制入射光线plt.plot([0, np.cos(theta_i)], [0, np.sin(theta_i)], 'r--', label=f'入射光线 (θ={theta_i_deg:.2f}°)')# 绘制反射光线plt.plot([0, np.cos(theta_r)], [0, -np.sin(theta_r)], 'g--', label=f'反射光线 (θ={theta_r_deg:.2f}°)')# 绘制折射光线plt.plot([0, np.cos(theta_t)], [0, -np.sin(theta_t)], 'b--', label=f'折射光线 (θ={theta_t_deg:.2f}°)')# 设置图形属性plt.xlim(-1, 1)plt.ylim(-1, 1)plt.legend()plt.title('光的折射、反射和全反射模拟')plt.show()# 主函数
def main():# 用户输入n1 = float(input("请输入入射介质的折射率 (n1): "))n2 = float(input("请输入折射介质的折射率 (n2): "))theta_i_deg = float(input("请输入入射角 (度数): "))# 转换为弧度theta_i = np.radians(theta_i_deg)# 绘制光线路径plot_rays(n1, n2, theta_i)# 运行主函数
if __name__ == "__main__":main()

代码解释

  • 导入库:导入了NumPy库用于数学计算,以及Matplotlib库用于绘图。
  • 计算函数:calculate_angles函数根据斯涅尔定律计算折射角和反射角。
  • 绘制函数:定义了一个函数 plot_rays(n1, n2, theta_i),用于绘制光线的路径。在这个函数中,首先调用了 calculate_angles 函数计算出反射角和折射角,然后将角度转换为度数,并利用Matplotlib库绘制了入射光线、反射光线和折射光线的路径。
  • 主函数:main函数获取用户输入的折射率和入射角,并调用绘制函数生成图形。

动态更新

  要实现动态更新图形,可以在 plot_rays 函数中添加一个循环,让用户可以多次输入参数并动态更新图形。让我来详细描述如何修改代码:

  • 在 plot_rays 函数中,将绘图的部分放在一个循环中,让用户可以多次输入参数并动态更新图形。可以使用一个 while 循环,每次循环都要求用户输入新的折射率和入射角度。

  • 在每次循环开始时,清除之前的图形,可以使用 plt.clf() 函数来清除当前图形。

  • 接着在循环内部,用户输入新的折射率和入射角度,并重新计算角度,然后绘制新的光线路径。

  • 用户可以选择在每次循环结束后询问是否继续动态更新图形,如果用户选择退出,则退出循环。

  通过这种方式,用户可以不断输入新的参数,程序会根据新的参数重新计算角度并更新图形,实现动态更新的效果。

参考文献

  • 斯涅尔定律
  • Matplotlib 官方文档
  • Numpy 官方文档

总结

  通过以上提供的代码框架和解释,用户可以利用Python中的matplotlib和numpy库实现光的折射、反射和全反射的模拟。具体步骤包括导入必要的库、定义计算函数、绘制初始图形和动态更新图形。

  在代码中,用户可以通过输入不同介质的折射率和入射角来计算反射角和折射角,然后绘制入射光线、反射光线和折射光线的路径。通过动态更新图形,用户可以实时观察不同折射率和入射角对光线路径的影响,从而更好地理解光的行为规律。

  这个模拟程序不仅有助于加深对光学原理的理解,还可以帮助用户直观地观察光在不同介质中的传播情况,以及理解斯涅尔定律和反射定律在光学中的应用。通过这个项目,用户可以结合编程和光学知识,探索光的折射、反射和全反射现象,进一步拓展对光学世界的认识。

  总之,这个项目为用户提供了一个有趣而教育性的学习机会,通过实际编程和可视化模拟,帮助用户深入理解光的行为规律,同时培养编程能力和科学思维。希望这个总结能够帮助你更好地理解和实现光的折射、反射和全反射模拟项目!


  码文不易,本篇文章就介绍到这里,如果想要学习更多Java系列知识点击关注博主,博主带你零基础学习Java知识。与此同时,对于日常生活有困扰的朋友,欢迎阅读我的第四栏目:《国学周更—心性养成之路》,学习技术的同时,我们也注重了心性的养成。

在这里插入图片描述

相关文章:

使用 Python 模拟光的折射,反射,和全反射

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...

大厂太卷了!又一款国产AI视频工具上线了,免费无限使用!(附提示词宝典)

大家好,我是程序员X小鹿,前互联网大厂程序员,自由职业2年,也一名 AIGC 爱好者,持续分享更多前沿的「AI 工具」和「AI副业玩法」,欢迎一起交流~ 记得去年刚开始分享 AI 视频工具的时候,介绍的大多…...

vue3扩展echart封装为组件库-快速复用

ECharts ECharts,全称Enterprise Charts,是一款由百度团队开发并开源,后捐赠给Apache基金会的纯JavaScript图表库。它提供了直观、生动、可交互、可个性化定制的数据可视化图表,广泛应用于数据分析、商业智能、网页开发等领域。以…...

随机掉落的项目足迹:Vue3 + wangEditor5富文本编辑器——toolbar.getConfig() 查看工具栏的默认配置

问题引入 小提示:问题引入是一个讲故事的废话环节,各位小伙伴可以直接跳到第二大点:问题解决 我的项目不需要在富文本编辑器中引入添加代码块的功能,于是我寻思在工具栏上把操作代码的菜单删一删 于是我来到官网文档工具栏配置 …...

更新 Git 软件

更新 Git 软件本身是指将你当前安装的 Git 版本升级到最新版本。不同的操作系统有不同的更新方法。以下是针对 Windows、macOS 和 Linux 的 Git 更新步骤: Windows 检查当前版本: git --version访问官网下载最新版本: 访问 Git 官方网站 (ht…...

Keil根据map文件确定单片机代码存储占用flash情况

可以从map文件中查看得知,代码占用内存情况大概为35KB,而在在线仿真时,可以看到在flash的0x8008F64地址前均有数据,是代码数据,8F64(HEX)36708(DEC),36708/102335,刚好35。因此,要想操作读写flash,必须在不…...

ByteTrack多目标跟踪流程图

ByteTrack多目标跟踪流程图 点个赞吧,谢谢。...

什么是L2范数

定义: 在数学和计算中,L2 范数是一种用于测量向量长度或大小的方法,也被称为欧几里得范数。对于一个 n 维向量 x ( x 1 , x 2 , … , x n ) \mathbf{x} (x_1, x_2, \dots, x_n) x(x1​,x2​,…,xn​),其 L2 范数定义为&#x…...

Scrapy爬虫IP代理池:提升爬取效率与稳定性

在互联网时代,数据就是新的黄金。无论是企业还是个人,数据的获取和分析能力都显得尤为重要。而在众多数据获取手段中,使用爬虫技术无疑是一种高效且广泛应用的方法。然而,爬虫在实际操作中常常会遇到IP被封禁的问题。为了解决这个…...

信息技术(IT)行业的发展

近年来,信息技术(IT)行业的发展呈现出前所未有的活力和潜力。随着全球数字化转型的加速,IT行业正逐步成为推动社会经济发展的重要引擎。无论是互联网、大数据、人工智能,还是云计算、物联网,这些新兴技术都…...

C++primer第十一章使用类(矢量随机游走实例)

操作符重载 操作符重载(operator overoading)是一种形式的 C多态。 第8章介绍了C是如何使用户能够定义多个名称相同但特征标(参数列表)不同的函数的。这被称为函数重载(function overloading)或函数多态(functional polymorphism),旨在让您能够用同名的函数来完成…...

服务器为什么会受到网络攻击?

随着科技的 快速发展,企业也开展了越来越多的线上业务,但同时也遭受到各种各样的网络攻击,那服务器为什么会受到网络攻击呢?下面就让小编带领大家一起来了解一下吧! 首先企业中服务器被攻击的原因有很多,主…...

IDA Pro基本使用

IDA Pro基本使用 1.DllMain的地址是什么? 打开默认在的位置1000D02E就是DllMain地址 按空格键可以看到图形化界面选择options、general勾选对应的选项在图像化也能看到 2.使用Imports 窗口并浏览到 gethostbyname,导入函数定位到什么地址? 这里可以打开Impo…...

Day.js时间插件的安装引用与常用方法大全

🚀 个人简介:某大型国企资深软件研发工程师,信息系统项目管理师、CSDN优质创作者、阿里云专家博主,华为云云享专家,分享前端后端相关技术与工作常见问题~ 💟 作 者:码喽的自我修养&#x1f9…...

aws 容器镜像仓库操作

aws 容器镜像仓库产品叫ECR,官方文档参考:Amazon Elastic Container Registry。 1)账号认证 # 配置aws命令 $ aws configure set aws_access_key_id ${ak} $ aws configure set aws_secret_access_key ${sk} 2)镜像仓库登陆 #…...

学习记录:js算法(四十一): 基于时间的键值存储

文章目录 基于时间的键值存储网上思路 总结 基于时间的键值存储 设计一个基于时间的键值数据结构,该结构可以在不同时间戳存储对应同一个键的多个值,并针对特定时间戳检索键对应的值。 实现 TimeMap 类: TimeMap() 初始化数据结构对象void se…...

C语言 | Leetcode C语言题解之第424题替换后的最长重复字符

题目&#xff1a; 题解&#xff1a; int characterReplacement(char* s, int k) {int num[26];memset(num, 0, sizeof(num));int n strlen(s);int maxn 0;int left 0, right 0;while (right < n) {num[s[right] - A];maxn fmax(maxn, num[s[right] - A]);if (right - …...

大数据时代的PDF解析:技术与挑战

在大数据时代&#xff0c;海量信息以不同格式存储&#xff0c;其中 PDF 文件凭借其广泛应用成为了各种业务场景下的主要文档格式。无论是政府文件、企业报告&#xff0c;还是学术论文和技术文档&#xff0c;PDF 都是信息交流的重要媒介。然而&#xff0c;随着信息的爆炸式增长&…...

《nmap 命令全解析:网络探测与安全扫描的利器》

文章目录 一、引言二、nmap 命令概述三、nmap 基本用法&#xff08;一&#xff09;安装 nmap&#xff08;二&#xff09;简单扫描示例 四、nmap 常见参数&#xff08;一&#xff09;-sS&#xff08;TCP SYN 扫描&#xff09;&#xff08;二&#xff09;-sT&#xff08;TCP 连接…...

2024年华为OD机试真题-斗地主之顺子-Python-OD统一考试(E卷)

最新华为OD机试考点合集:华为OD机试2024年真题题库(E卷+D卷+C卷)_华为od机试题库-CSDN博客 每一题都含有详细的解题思路和代码注释,精选c++、JAVA、Python三种语言解法。帮助每一位考生轻松、高效刷题。订阅后永久可看,持续跟新。 题目描述 在斗地主只扑克牌游戏中,…...

亲测有效,长期有效的RTSP流地址公网RTSP地址,各种类型的视频源

我们经常需要做一些实时视频流的测试&#xff0c;但是手边又没有办法及时弄到一个摄像机&#xff0c;我们经常会去搜索一下“公网RTSP地址”&#xff0c;但是大部分现在都失效了&#xff0c;有什么办法能够让我们快速构建一个RTSP流&#xff0c;点几下就能直接用&#xff1f; …...

Excel常用函数大全

Excel常用函数介绍与示例应用 在Excel中&#xff0c;函数是进行数据处理和分析的强大工具。对于新手来说&#xff0c;掌握一些基本的函数使用方法能够大大提升工作效率。以下是一份通俗易懂、适合新手的Excel函数使用方法总结&#xff1a; 1. 求和函数&#xff08;SUM&#x…...

领夹麦克风哪个品牌好,无线领夹麦克风品牌排名,麦克风品牌大全

无线领夹麦克风因其便携性和隐蔽性&#xff0c;越来越受到演讲者和表演者的青睐。但是&#xff0c;随着市场上品牌和型号的增多&#xff0c;质量也变得参差不齐。许多用户在选购时&#xff0c;会因为缺乏了解而选择到性能不佳的产品&#xff0c;影响声音的清晰度和稳定性。下面…...

【C语言零基础入门篇 - 15】:单链表

文章目录 单链表链表的基本概念单链表功能的实现单链表的初始化单链表新结点的创建单链表头插法单链表的输出单链表的查找单链表修改单链表的删除单链表所有数据结点释放源代码 单链表 链表的基本概念 一、什么是链表&#xff1f; 链表是数据结构中线性表的一种&#xff0c;其…...

Linux主流Web服务器:你选择哪一款?

在Linux环境下&#xff0c;选择Web服务器通常取决于特定需求、资源限制、以及对性能的期望。以下是对几款主流Linux Web服务器的详细分析&#xff1a; 1. Apache HTTP Server - 特点&#xff1a;Apache是功能最全面的Web服务器之一&#xff0c;支持模块化架构&#xff0c;拥…...

光耦知识分享:解读晶体管光耦主要性能指标

晶体管光耦是一种常用的光电耦合器&#xff0c;用于隔离和传输电信号&#xff0c;它包含有光电发射管和接收晶体管两个主要部分。解读晶体管光耦的主要指标有助于了解其性能和应用范围&#xff0c;主要指标包括&#xff1a; 最大工作电压&#xff08;V_R_MAX&#xff09;&…...

laravel public 目录获取

在Laravel框架中&#xff0c;public目录是用来存放公共资源的&#xff0c;如CSS、JS、图片等。你可以通过多种方式获取public目录的路径。 方法一&#xff1a;使用helper函数public_path() $path public_path(); 方法二&#xff1a;使用Request类 $path Request::root().…...

强化学习策略买卖股票的效果如何?

Github 项目&#xff1a; GitHub - daocodedao/stable-baselines-stock: 深度强化学习自动炒股 主体参考了 https://github.com/wangshub/RL-Stock&#xff0c;修改了一些 requirements 修改到新版本支持 macstable-baselines 改为 stable-baselines3 使用强化学习预测股价…...

Kotlin 基本介绍(一)

导读大纲 1.1.1 Kotlin 是安全的1.1.2 Kotlin 具有互操作性1.1.3 什么是 idiomatic Kotlin&#xff1f; 1.1.1 Kotlin 是安全的 一般来说,当我们说一种编程语言是安全的 我们指的是它的设计可以防止程序中出现某些类型的错误当然,这并不是绝对的;没有一种语言能防止所有可能出现…...

Cocos Creator发布Moloco平台试玩广告(PlayableAd)

官方文档 主要遇到了两点问题。 1.HTML文件内的body需要注入 <script>window.FBPlayableOnCTAClick () > {(typeof FbPlayableAd undefined) ? alert(FBPlayableAd.onCTAClick) : FbPlayableAd.onCTAClick()}</script> 2.跳转商店使用 window.parent.postM…...