在matlab中定义最小边界圆

时间:2013-06-29 06:37:43

标签: matlab

问题是

  

a.write一个函数,它找到具有最小区域的圆圈。它绑定给定的点列表(使用fminsearch并给出适当的图)。   b。如果你管理了球体做同样的事情(找到一个体积最小的球体)

到目前为止我尝试过:

%%Main function    
function minarea= mincircle(points)
maxx=max(points(1,:));
maxy=max(points(2m:));
radius=max(maxx,maxy);
minarea=fminsearch(@(x) circle(x,r,c),[0,0])
end
%%This function is supposed to give equalation of circle
function eq=circle(x,r,c)
eq=(x(1)-c(1)).^2+(x(2)-c(2)).^2 %=r?
% and here I don't know how to insert r:
end`

为了更好地理解,我会附上草图。

a circle

在这些术语中,我想找到中心位于O

的圆的区域

2 个答案:

答案 0 :(得分:4)

注意:我不相信你画的圆是最小的边界圆。它应该更小,向上和向右,并且应该在其周边至少触摸两个点。

解决问题

我们有一组点,我们想绘制一个包含所有点的圆。问题是你需要三位信息来定义一个圆:圆的中心的X和Y坐标,以及圆的半径。所以这个问题看起来并不简单。

然而,有一个相关的问题更容易解决。假设圆的中心是固定的。从那时起,我们使一个圆同心地向外生长,使它变得越来越大。在某些时候,圆圈将包含我们集合中的一个点。随着它变大,它将包含第二个点和第三个点,直到我们集合中的所有点落入我们的圈内。很明显,一旦集合中的最后一个点落入我们的圆圈内,我们就会得到包含所有点的最小圆圈,因为我们从固定圆心的中心点开始。

此外,我们可以确定这个圆的半径是多少。它只是从集合中任意点到圆心的最大距离,因为我们在扩展圆周边触摸最后一个点时停止。

下一个问题是确定放置圆心的最佳起点是什么?显然,如果起点远离我们集合中的所有点,那么半径必须非常大甚至包含集合中的一个点。直觉上,它必须在中间"我的观点在哪里。但到底在哪里呢?

使用fminsearch

我的建议是你要找到点P(x,y),它最小化你需要增大圆圈的大小以包含集合中的所有点。我们很幸运,我们可以使用fminsearch找到P。

According to the fminsearch documentation,传入的函数必须是一个参数(可能是一个数组)的函数,并且必须返回一个标量。我们的想法是,您希望函数的输出尽可能小,并且您想要找出哪些输入可以实现。

在我们的例子中,我们想要编写一个输出圆的大小的函数,给定圆的 center 作为输入。这样,fminsearch将找到仍然包含所有点的最小圆圈的中心。我将编写一个函数,输出所需的半径,以包含给定中心点P的所有点。

pointsX = [..]; % X-coordinates of points in the set
pointsY = [..]; % Y-coordinates of points in the set

function r = radiusFromPoint(P)
    px = P(1);
    py = P(2);
    distanceSquared = (pointsX - px).^2 + (pointsY - py).^2;
    r = sqrt(max(distanceSquared));
end

然后我们想用fminsearch来找到给我们最小半径的点。我只是天真地使用原点(0,0)作为我的初始估计,但你可能有更好的想法(比如使用集合中的第一个点)

P0 = [0, 0];  % starting estimate
[P, radiusMin] = fminsearch(@radiusFromPoint, P0);

圆圈的中心位于P,半径为radiusMin

我会留给你绘制输出并概括为3D案例!

答案 1 :(得分:0)

实际上,虽然你可能需要它来完成你的家庭作业(我认为这就是这个),你根本不需要使用优化器。使用我的minimal bounding tools发布的minboundcircle代码不使用优化器。 (还有一个minboundsphere工具。)

无论如何,你可能会发现一些有用的技巧。至少,学习如何通过使用凸包来减小问题的大小(以及解决方案的速度)。毕竟,只有凸包上的点才能确定最小的边界圆。所有其他点只是浪费CPU时间。