【问题标题】:Ray and surface intersection射线与曲面相交
【发布时间】:2015-12-08 09:17:17
【问题描述】:

我对 Matlab 比较陌生,也许这个问题并不难,但我遇到了问题。我的代码是这样的

x=-25:0.1:25; y=-25:0.1:25; [X,Y] = meshgrid(x,y);
R=sqrt(X.^2+Y.^2);
Z=sin(R);

faces=delaunay(X,Y);
alpha(0.3);
trisurf(faces,X,Y,Z,'Edgecolor','none');
axis ([-20 20 -20 20 -1 51]);
axis equal;
xlabel('X');
ylabel('Y');
alpha(1);
hold on
syms t;
x_source=20;  
x_dir=-2;
y_source=0;   
y_dir=3;
z_source=50;  
z_dir=-10;

height_above_plane = @(t) z_source + t * z_dir - interp2(X, Y, Z, ...
    x_source + t*x_dir, y_source + t*y_dir);
t_intercept = fzero(height_above_plane, 0)

x_ray = x_source + t_intercept * x_dir;
y_ray = y_source + t_intercept * y_dir;
z_ray = z_source + t_intercept * z_dir;
plot(x_ray,y_ray,'r.','MarkerSize',10);

好像光线从位置 20;0;50 开始。我正在尝试做的是一个虚拟激光扫描程序。 fzero 给了我一个 NaN,当 x_dir 超过一个小数字并且我不知道为什么...任何帮助将不胜感激!

解决问题后的坏循环:

t=0;
x_source=20;
y_source=0;
z_source=50;
z_dir=-10;
for alfa=26:0.5:6
 x_dir=tand(alfa)*z_dir;
    for beta=16:0.5:-16
    y_dir=tand(beta)*z_dir;    
  y_dir=3;
    height_above_plane = @(t) z_source + t * z_dir - interp2(X, Y, Z, ...
    x_source + t*x_dir, y_source + t*y_dir,'linear',0);
    t_intercept = fmincon(@(t) abs(height_above_plane(t)),0,[],[],[],[],4.5,6)

    x_ray = x_source + t_intercept * x_dir;
    y_ray = y_source + t_intercept * y_dir;
    z_ray = z_source + t_intercept * z_dir;
    plot(x_ray,y_ray,'k.','MarkerSize', 20);
    end;
end;

【问题讨论】:

    标签: matlab graphics scanning


    【解决方案1】:

    完整的错误是

    Exiting fzero: aborting search for an interval containing a sign change
        because NaN or Inf function value encountered during search.
    (Function value at -2.56 is NaN.)
    Check function or try again with a different starting value.
    

    并且您在 -2.56 处评估的函数确实返回 NaN。这是因为您正在做interp2(X,Y,Z,x_source + t*x_dir, y_source + t*y_dir)x_source-2.56*x_dir=25.12。由于您的数据仅适用于 -25 到 25 之间的 x,因此您必须外推才能在此处获取插值。默认情况下,Matlab 返回NaN 用于外推,但您可以使用可选的第五个参数将值更改为interp2EXTRAPVAL(将,'linear',0 添加到interp2 调用中,查看文档(0 可能不是一个不错的选择))。

    如果您想要约束根求解,请考虑改用 fmincon,如下所示:

    t_intercept = fmincon(@(t) abs(height_above_plane(t)),0,[],[],[],[],-2.5,25/3)
    

    这更慢,但更健壮,只要您有办法计算出t 的限制必须是什么。

    【讨论】:

    • 非常感谢,成功了!但是,我尝试将其放入 for 循环中失败了。虽然它没有给我任何错误,所以我又一次不知道该怎么办..我编辑了原始帖子以显示周期
    • 您将不得不为我想象的每次迭代更改 4.5 和 6。
    • 哦,我以为那是我的 t 变量的区间。 “解决方案在 lb
    • 是的,这是t 的范围,但t 的范围是通过确保-25 < x_source + t*x_dir < 25y_source 来设置的,这样您就可以进行插值。也许尝试max((x_source-25)/x_dir,(y_source-25)/y_dir)作为下限,类似的东西(但使用min)作为上限。
    • z_dir 是一个常数 -10 并且与源的最小距离是 49.5 我们知道,t 永远不会小于 4.5,但有趣的是,甚至没有像 | 这样的循环对于 blob = 45:0.5:5 disp(blob) 结束 |一个单独的脚本现在在 matlab 上为我工作,也许是时候睡觉了......
    猜你喜欢
    • 2012-02-14
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 2019-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多