如果您的表面被定义为某个 XY 网格上的高度 Z,您可以使用fzero
. 这将排除一些复杂的形状,但可能适用于标准光学问题,例如光线撞击镜头。假设X
和是具有相同形状Y
的Z
二维矩阵。然后你可以做一个二维插值
z_interp = interp2(X,Y,Z,x_interp,y_interp)
如果不是这种情况,您应该尝试定义自己的函数,该函数可以z
基于x
和进行计算y
。
对于这条线,我们有
x_ray = x_source + t * x_dir
y_ray = y_source + t * y_dir
z_ray = z_source + t * z_dir
因此,您现在可以定义一个函数,计算表面上方的高度作为 as 的t
函数
height_above_plane = @(t) z_source + t * z_dir - interp2(X, Y, Z, ...
x_source + t*x_dir, y_source + t*y_dir)
请注意,这可能不是从点到平面的最短距离,它只是沿 z 方向测量的高度。现在可以通过搜索t
高度为零的 来找到射线撞击表面的时间。这可以使用以下方法对任意函数完成fzero
:
t_intercept = fzero(height_above_plane, 0);
这应该适用于定义表面的函数相对平滑且光线仅穿过表面一次的简单情况。有可能将具有更复杂几何形状的案例转换为这样一个简单的案例。