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

时间:2017-02-02 20:21:55

标签: c++ physics

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

\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度)。还有更好的方法吗?

1 个答案:

答案 0 :(得分:8)

来自您关联的Wikipedia page

  

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

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