matlab練習程式(Ritter‘s最小包圍圓)

Dsp Tian發表於2014-09-24

原始演算法是sphere,我這裡簡化為circle了。

Ritter's求最小包圍圓為線性演算法,因為非常簡單,所以應用非常廣泛。

該演算法求出的圓比最優圓大概會大個5%到20%左右,求最優圓應該可以用Bouncing Bubble演算法,以後有機會可以嘗試一下。

Ritter's演算法如下:

1.從點集中隨機選出兩個點作為直徑對圓進行初始化。

2.判斷下一個點p是否在圓中,如果在則繼續本步驟,如果不在則進行步驟3。

3.使用p作為新圓的一個邊界點,另一個邊界點為距離p最遠的圓上的點,使用這兩個點作為直徑構造新圓。

4.繼續步驟2,直到遍歷完所有點。

結果如下:

matlab程式碼如下:

clear all;close all;clc;

n=100;
p=rand(n,2);

p1=p(1,:);
p2=p(2,:);
r=sqrt((p1(1)-p2(1))^2+(p1(2)-p2(2))^2)/2;
cenp=(p1+p2)/2;

for i=3:n
    newp=p(i,:);    
    d=sqrt((cenp(1)-newp(1))^2+(cenp(2)-newp(2))^2);  
    if d>r
        r=(r+d)/2;
        cenp=cenp+(d-r)/d*(newp-cenp);
    end    
end

hold on;
plot(p(:,1),p(:,2),'o');
x0=cenp(1);
y0=cenp(2);
theta=0:0.01:2*pi;
x=x0+r*cos(theta);
y=y0+r*sin(theta);
plot(x,y,'-',x0,y0,'.');
axis equal

參考:http://en.wikipedia.org/wiki/Bounding_sphere

相關文章