今天,我解决了CODEV中引入自定义间断面的问题。积累了经验,与大家分享。 >Z r f}H
[|.IXdJ!
按照说明书,有间断的面最好使用USERSUR2,但是,当我打开他的模板后,发现比较复杂,这是一个专门为菲涅尔透镜的生成而编制的程序,参数很多,复杂之处在于处理与各个间断点有关的问题,具体我也没太看懂,只知道是反复叠代找到交点。 ^YiGvZJ
6}4?,r
但是,虽然codev的说明挡中强调USERSUR型子程序只适合于连续表面,但考虑到,光线追迹实际上只需要知道表面的函数和该点的导数,所以,如果在程序中仔细定义间断点处的导数,就可以当成连续面来处理。 W;!OxOWZJ
5+Fr/C
我的解决办法是,利用有限差分计算导数,而且是前后差分导数都计算出来,做对比,取绝对值小的那一个作为导数。因为,很容易理解,如果某个差分取在了间断点的两侧,一定很大。另一个较小的 lLhvpvT
"NWILZwEV
就是在间断点同侧取的。数学上来说,相当于左右导数。 KcKdhqdN-
yK9:LXhf
计算表明,比较OK。 A:!_ &