如何在3D曲面上找到最接近该曲面外的点的点?

问题描述 投票:0回答:1

我想在R3中具有代数表达式的表面上找到点B

f(x,y)= x ^ 3 + y ^ 2,

给定点A,因此点B在欧几里得距离中最接近,并且位于表面上。 [请注意,图中的表面不是x ^ 3 + y ^ 2,它仅是出于说明目的。

enter image description here

我不是Matlab用户,但是我发现函数fminconfminsearch可能是J. BAEK,A。DEOPURKAR和K. REDFIELD在此在线可访问paper中建议的方式(附录第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是一个有效的起点。

matlab optimization minimization
1个回答
0
投票

您撰写此问题时,可以使用fminsearch解决。前段时间,我基于Matlab的NURB工具箱编写了一个代码来解决您的问题。您可以用所需的函数替换NurbEval。

function [ncoord] = ProjectOnSurf(coord,surf)
    %Computes the closest point to given point on a NURB surface.
    f=@(lambda) FitQuality(coord(1:3),lambda,surf);
    %Finde minimal distance
    lambda=fminsearch(f,coord(3));
    ck=NurbEval(edges{coord(5)},lambda)';
    ncoord=[ck(1:2),lambda,2,coord(5)];
end

function out=FitQuality(x,lambda,surf)
if min(lambda)<0
    out=norm([x,0]-NurbEval(surf,0)')+min(lambda)*-1;
elseif max(lambda)>1
    out=norm([x,0]-NurbEval(surf,0)')+max(lambda);
else
    out=norm([x,0]-NurbEval(surf,lambda)');
end
end
© www.soinside.com 2019 - 2024. All rights reserved.