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

2022-06-10 18:27:10 字數 1079 閱讀 7106

原始演算法是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);

endend

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

參考:

matlab練習程式(DBSCAN)

和kmeans相比,不需要事先知道資料的類數。以程式設計的角度來考慮,具體演算法流程如下 1.首先選擇乙個待處理資料。2.尋找和待處理資料距離在設定半徑內的資料。3.將找到的半徑內的資料放到乙個佇列中。4.拿佇列頭資料作為當前待處理資料並不斷執行第2步。5.直到遍歷完佇列中所有資料,將這些資料記為一...

matlab練習程式(c c 呼叫matlab)

就我目前了解的c 呼叫matlab有兩種方法。第一種是通過matlab引擎呼叫,也就是這裡用到的方法。第二種是用matlab將m檔案編譯為相應的h lib dll檔案再加以呼叫。使用engine所用到的h和lib檔案基本在d program files matlab r2010b extern裡面,...

matlab練習程式(SUSAN檢測)

susan運算元既可以檢測角點也可以檢測邊緣,不過角點似乎比不過harris,邊緣似乎比不過canny。不過思想還是有點意思的。主要思想就是 首先做乙個和原影象等大的目標影象。然後用乙個圓形的模板,用模板去遍歷原影象每個畫素,把模板內的每個畫素都和模板中心畫素比較,如果灰度小於乙個閾值,那麼就對目標...