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

我想实现一个简单的程序来可视化法律。由于和是已知的,因此这是我的计算方式:

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

问题在于,对于和的某些值(例如,对于玻璃和空气,分别为1.52和1.0),对于更大的 Angular ,(sin(theta1) * n1) / n2的结果可能大于1.0,这使得asin返回NaN。我要解决的方法是检查(sin(theta1) * n1) / n2是否大于1.0,如果是这种情况,请先从中减去1,使用新值进行计算,然后向其添加0.5 * M_PI(或90.0度)。有没有更好的办法?

最佳答案

从您链接的相同Wikipedia page中:



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

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

10-11 15:55