[英]How can I find the point on a 3D surface closest to a point outside that surface?
我想用代数表达式在 R3 的表面上找到点 B
f(x,y) = x^3 + y^2,
给定点 A,所以点 B 在欧几里德距离上最近,并且位于表面上。 [请注意,图中的曲面不是 x^3 + y^2,仅用于说明目的]。
我不是 Matlab 用户,但我看到函数fmincon或fminsearch可能是 J. BAEK、A. DEOPURKAR 和 K. REDFIELD(第 24 页,附录)在这篇可访问的在线论文中所建议的方法。 或者,我想通过围绕 A 点的半径来参数化一个球体,并寻找它与表面的第一个切点,但这会产生更多的问题。
对于 fmincon 似乎第一件事是定义一个函数来最小化,这在数学上是欧几里得距离:所以如果点 A 在矩阵中,并且对应于 A(:,1) 并且 B 被定义为(b1,b2,b3),最小化公式为
(A(1,1) - b1)^2 + (A(2,1) - b2)^2 + (A(3,1) - b3)^2
与第一条评论一样,由于 B 必须在表面上,因此约束条件将是
b3= b1^3 + b2^2。
我不知道如何在 Matlab 中将其形式化,也不知道我是否需要某个初始点来启动该过程,或者 A 是一个有效的起点。
正如你所写,这个问题可以用 fminsearch 解决。 前段时间我写了一个代码来解决你的问题,基于 NURB Toolbox for Matlab。 我只是为你的问题简化了一点。 在这种情况下, surf 是表面函数的函数句柄。 如果你有一个比 [0, 0] 更好的起点,你可以改用它。
function Y = ProjectOnSurf(X,surf)
%Computes the closest point to given point on a surface.
f=@(lambda) norm(surf(lambda) - X)
lambda=fminsearch(f,[0, 0]); %Find parameters for minimal distance
Y=NurbEval(surf,lambda)'; %Solve function for parameters
end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.