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

1 c++ physics

斯内尔定律指出,入射角和折射角的正弦比等于给定材料折射率之比的倒数:

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

我想实现一个简单的程序来可视化法律.以来\ _ta _ {1} , n _ {1}n _ {1} 众所周知,这是我的计算方法 \ _ta _ {2}:

theta2 = asin((sin(theta1) * n1) / n2);
Run Code Online (Sandbox Code Playgroud)

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

Fab*_*ica 8

从您链接的同一维基百科页面:

当光从具有较高折射率的介质传播到具有较低折射率的介质时,在某些情况下(当入射角足够大时),Snell定律似乎要求折射角的正弦大于1.这当然是不可能的,在这种情况下光线完全被边界反射,这种现象称为全内反射.

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