Snell's law指出入射角和折射角的正弦比等于给定材料折射率之比的倒数:
我想实现一个简单的程序来可视化法律。由于,和已知,以下是我如何计算:
theta2 = asin((sin(theta1) * n1) / n2);
问题在于,对于和的某些值(例如分别为玻璃和空气的1.52和1.0),(sin(theta1) * n1) / n2
的结果可能大于1.0角度,使asin
返回NaN。我处理此问题的方法是检查(sin(theta1) * n1) / n2
是否大于1.0,如果是这种情况,请先从中减去1,使用新值计算,然后添加0.5 * M_PI
(或90.0度)。还有更好的方法吗?
答案 0 :(得分:8)
来自您关联的Wikipedia page:
当光从折射率较高的介质传播到折射率较低的介质时,Snell定律似乎在某些情况下(每当入射角足够大时)需要角度的正弦值折射大于1。 这当然是不可能的,这种情况下的光线完全被边界反射,这种现象称为total internal reflection。
所以,你做错了。如果你想避免处理NaN,检查这个值是否高于1是一件好事;但如果它发生了,一定不要用一些数学技巧来规避它!它具有精确的物理意义,必须保留其意义!