gpt4 book ai didi

c++ - Snell 定律 — 如何处理 asin() 中的无效值?

转载 作者:太空宇宙 更新时间:2023-11-03 10:24:30 25 4
gpt4 key购买 nike

Snell's law指出入射角和折射角的正弦比等于给定 Material 折射率比的倒数:

\frac{\sin{\Theta _{1}}}{\sin{\Theta _{2}}} = \frac{n _{2}}{n _{1}}

我想实现一个简单的程序来可视化法律。自 \Theta _{1} , n _{1}n _{1}是已知的,这是我计算的方式 \Theta _{2} :

theta2 = asin((sin(theta1) * n1) / n2);

问题是对于 n _{1} 的某些值和 n _{1} (例如玻璃和空气分别为 1.52 和 1.0),(sin(theta1) * n1)/n2 的结果对于更大的角度可以大于 1.0,这使得 asin 返回 NaN。我处理这个问题的方法是检查 (sin(theta1) * n1)/n2 是否大于 1.0,如果是这种情况,首先从中减去 1,计算 \Theta _{2}使用新值,然后向其添加 0.5 * M_PI(或 90.0 度)。有没有更好的办法?

最佳答案

来自同一个Wikipedia page您链接的:

When light travels from a medium with a higher refractive index to one with a lower refractive index, Snell's law seems to require in some cases (whenever the angle of incidence is large enough) that the sine of the angle of refraction be greater than one. This of course is impossible, and the light in such cases is completely reflected by the boundary, a phenomenon known as total internal reflection.

所以,你做错了。如果您想避免处理 NaN,检查该值是否高于 1 是一件好事;但如果发生这种情况,请务必不要使用一些数学技巧来规避它!它具有精确的物理含义,必须保留该含义!

关于c++ - Snell 定律 — 如何处理 asin() 中的无效值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42011621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com