news 2026/9/3 1:49:43

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

作者头像

张小明

前端开发工程师

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/9/2 15:17:39

Langchain-Chatchat保险理赔流程知识问答系统

Langchain-Chatchat保险理赔流程知识问答系统 在保险公司日常运营中&#xff0c;一个常见的场景是&#xff1a;客户打电话咨询“我车撞了护栏&#xff0c;能赔吗&#xff1f;”客服人员立刻翻出几百页的《车险理赔指南》PDF&#xff0c;逐章查找责任条款、事故类型说明和材料清…

作者头像 李华
网站建设 2026/9/2 17:55:11

Langchain-Chatchat模糊测试(Fuzzing)知识问答系统

Langchain-Chatchat模糊测试&#xff08;Fuzzing&#xff09;知识问答系统 在企业日益依赖人工智能进行内部决策支持的今天&#xff0c;一个看似智能的知识助手突然因一段异常输入而崩溃——这不仅影响用户体验&#xff0c;更可能暴露系统深层的安全隐患。尤其当这套系统承载着…

作者头像 李华
网站建设 2026/9/2 6:07:28

Langchain-Chatchat XSS跨站脚本防护问答工具

Langchain-Chatchat XSS跨站脚本防护问答工具 在企业知识管理日益智能化的今天&#xff0c;越来越多组织开始尝试将大型语言模型&#xff08;LLM&#xff09;引入内部系统&#xff0c;用于政策查询、技术答疑和文档检索。然而&#xff0c;一个现实问题摆在面前&#xff1a;如何…

作者头像 李华
网站建设 2026/9/2 20:39:46

滚柱导轨中的密封件如何判断是否需更换?

滚柱导轨在自动化领域中是常用的传动元件&#xff0c;被广泛应用于重型机床、自动化生产线与精密仪器中。其中导轨中的密封件对设备稳定运行至关重要&#xff0c;若密封件失效&#xff0c;杂质或灰尘侵入会加速导轨磨损。那么&#xff0c;怎样判断滚柱导轨的密封件是否需要更换…

作者头像 李华
网站建设 2026/9/2 16:55:20

Langchain-Chatchat漏洞库智能查询工具开发

Langchain-Chatchat漏洞库智能查询工具开发 在网络安全响应日益紧迫的今天&#xff0c;安全团队常常面临一个尴尬的局面&#xff1a;面对突发漏洞&#xff0c;明明知道相关信息就在某份PDF补丁说明或技术公告里&#xff0c;却要花费数小时翻找文档、交叉比对。传统的关键词搜索…

作者头像 李华
网站建设 2026/9/2 17:39:49

什么是销售漏斗?一次说清线索转化、商机管理的底层逻辑

先说一句可能有点扎心的话。90% 的企业嘴上在说“我们有销售漏斗”&#xff0c;实际上只是给 CRM 里加了几个状态字段。实际上&#xff1a;线索从哪来&#xff0c;说不清商机为什么卡住&#xff0c;没人知道成单率低&#xff0c;只能怪销售不给力今天这篇文章&#xff0c;我不打…

作者头像 李华