news 2026/7/22 17:31:24

制作物理知识动画 光的折射控制器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
制作物理知识动画 光的折射控制器

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>光的折射控制器</title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<style>
body {
display: flex;
flex-direction: column;
align-items: center;
background: #f0f0f0;
font-family: Arial, sans-serif;
}
#container {
position: relative;
width: 600px;
height: 400px;
border: 2px solid #333;
margin: 20px 0;
overflow: hidden;
}
#medium1 {
position: absolute;
top: 0;
width: 100%;
height: 50%;
background: #e0f7fa;
}
#medium2 {
position: absolute;
bottom: 0;
width: 100%;
height: 50%;
background: #bbdefb;
}
#normal {
position: absolute;
left: 300px;
top: 0;
width: 1px;
height: 400px;
background: #f00;
}
#ray {
position: absolute;
left: 300px;
top: 0;
width: 200px;
height: 2px;
background: #000;
transform-origin: left center;
}
#ray::after {
content: '';
position: absolute;
right: 0;
top: -5px;
border: 6px solid transparent;
border-left-color: inherit;
}
.control {
margin: 10px 0;
}
</style>
</head>
<body>
<h1>光的折射控制器</h1>
<div id="container">
<div id="medium1" title="介质1"></div>
<div id="medium2" title="介质2"></div>
<div id="normal" title="法线"></div>
<div id="ray" title="光线"></div>
</div>

<div class="control">
<label>入射角:<span id="iAngle">45</span>°</label>
<input type="range" id="iSlider" min="0" max="89" value="45">
</div>
<div class="control">
<label>介质1折射率:<span id="n1Val">1.0</span></label>
<input type="range" id="n1Slider" min="1.0" max="2.0" step="0.1" value="1.0">
</div>
<div class="control">
<label>介质2折射率:<span id="n2Val">1.5</span></label>
<input type="range" id="n2Slider" min="1.0" max="2.0" step="0.1" value="1.5">
</div>
<div class="control">
<label>光线颜色:</label>
<input type="color" id="colorPicker" value="#000000">
</div>
<div class="control">
<label>折射角:<span id="rAngle">28</span>°</label>
</div>
<div class="control">
<label>斯涅尔定律:n₁sinθ₁ = n₂sinθ₂</label>
</div>

<script>
const ray = document.getElementById('ray');
const iAngleSpan = document.getElementById('iAngle');
const rAngleSpan = document.getElementById('rAngle');
const n1ValSpan = document.getElementById('n1Val');
const n2ValSpan = document.getElementById('n2Val');
const iSlider = document.getElementById('iSlider');
const n1Slider = document.getElementById('n1Slider');
const n2Slider = document.getElementById('n2Slider');
const colorPicker = document.getElementById('colorPicker');

function updateRay() {
const iAngle = parseFloat(iSlider.value);
const n1 = parseFloat(n1Slider.value);
const n2 = parseFloat(n2Slider.value);

// 计算折射角(斯涅尔定律)
const sinI = Math.sin(iAngle * Math.PI / 180);
const sinR = (n1 * sinI) / n2;
const rAngle = sinR > 1 ? 90 : Math.asin(sinR) * 180 / Math.PI;

// 更新显示
iAngleSpan.textContent = iAngle;
rAngleSpan.textContent = rAngle.toFixed(0);
n1ValSpan.textContent = n1;
n2ValSpan.textContent = n2;

// 绘制入射光线
ray.style.transform = `rotate(${iAngle}deg)`;
ray.style.width = '200px';
ray.style.top = '0';
ray.style.backgroundColor = colorPicker.value;
ray.style.borderLeftColor = colorPicker.value;

// 绘制折射光线
if (sinR <= 1) {
const refractedRay = document.getElementById('refractedRay') || document.createElement('div');
refractedRay.id = 'refractedRay';
refractedRay.style.position = 'absolute';
refractedRay.style.left = '300px';
refractedRay.style.top = '200px';
refractedRay.style.width = '200px';
refractedRay.style.height = '2px';
refractedRay.style.backgroundColor = colorPicker.value;
refractedRay.style.transformOrigin = 'left center';
refractedRay.style.transform = `rotate(${-rAngle}deg)`;
refractedRay.style.borderLeftColor = colorPicker.value;
refractedRay.innerHTML = '<div style="position:absolute;right:0;top:-5px;border:6px solid transparent;border-left-color:inherit;"></div>';
document.getElementById('container').appendChild(refractedRay);
} else {
document.getElementById('refractedRay')?.remove();
}
}

// 绑定事件
iSlider.addEventListener('input', updateRay);
n1Slider.addEventListener('input', updateRay);
n2Slider.addEventListener('input', updateRay);
colorPicker.addEventListener('input', updateRay);

// 初始化
updateRay();
</script>
</body>
</html>

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/22 2:27:56

9大高级RAG技术详解:提升大模型检索效果的实战指南

文章介绍9种优化RAG系统的高级技术&#xff0c;包括智能文本分块、重新排序、元数据利用、混合搜索等&#xff0c;解决基本RAG系统的嘈杂结果和不相关上下文问题。文章详细说明如何使用Meilisearch、LangChain等工具实现这些策略&#xff0c;以及如何评估效果&#xff0c;帮助开…

作者头像 李华
网站建设 2026/7/21 0:51:56

Langchain-Chatchat移动设备安全管理知识库

Langchain-Chatchat移动设备安全管理知识库 在企业IT运维的日常场景中&#xff0c;一个常见的难题是&#xff1a;现场工程师面对突发的安全事件——比如员工手机丢失或平板电脑感染恶意软件——往往无法立即查阅冗长的安全手册&#xff0c;也难以在无网络环境下获取准确的操作…

作者头像 李华
网站建设 2026/7/22 6:30:21

Langchain-Chatchat JWT令牌机制知识库构建

Langchain-Chatchat JWT令牌机制与本地知识库构建解析 在企业数字化转型加速的今天&#xff0c;如何让沉睡在PDF、Word和内部文档中的知识“活起来”&#xff0c;成为提升组织效率的关键命题。尤其在金融、医疗、法律等高合规要求行业&#xff0c;数据不出内网已成为硬性底线。…

作者头像 李华
网站建设 2026/7/20 14:38:19

Langchain-Chatchat文件共享权限管理问答系统

Langchain-Chatchat 文件共享权限管理问答系统 在企业知识管理的现实场景中&#xff0c;一个常见的困境是&#xff1a;技术文档堆积如山&#xff0c;新员工入职却无从下手&#xff1b;HR制度频繁更新&#xff0c;但每次都被追问“年假怎么算”&#xff1b;研发团队积累了上百份…

作者头像 李华
网站建设 2026/7/22 6:16:14

Langchain-Chatchat IOC指标查询问答工具

Langchain-Chatchat IOC指标查询问答工具 在网络安全事件频发的今天&#xff0c;威胁情报分析已成为安全团队日常工作的核心环节。每当一次新的攻击曝光&#xff0c;分析师往往需要从数十份PDF格式的APT报告中手动提取恶意IP、C2域名和文件哈希等IOC&#xff08;Indicators of …

作者头像 李华
网站建设 2026/7/22 4:55:03

Langchain-Chatchat渗透测试报告生成辅助工具

Langchain-Chatchat&#xff1a;构建私有化渗透测试报告生成系统的实践探索 在网络安全攻防对抗日益激烈的今天&#xff0c;渗透测试作为企业安全建设的关键环节&#xff0c;正面临效率与规范性的双重挑战。一份高质量的渗透测试报告不仅需要详实的技术细节、严谨的风险评估&am…

作者头像 李华