%这个我想求数据集的最小包含圆
%用数据集2是没有问题的,可是用数据集1就有问题,算不出来,不收敛?
%问下高人怎么解决啊?
%注意,后面是一个函数……要是谁告诉我怎么做,万分感谢~~
clear all;close all;clc
figure;
%数据集1
ave_rou=[268.6
237.7
278.8
244.0
245.7
212.0
218.0
261.2
221.0
231.1
225.3
240.6
210.0
252.2
230.9
224.9]';
NaN_ratio=[68.8
66.4
63.3
64.1
65.6
64.8
71.9
58.6
62.5
64.8
57.8
62.5
69.5
57.0
64.8
76.6 ]';
% %数据集2
% ave_rou=[1 2 3 4 5 6 7 8 9];
% NaN_ratio=[2 5 7 9 4 1 5 8 9];
plot(ave_rou(:),NaN_ratio,'or');
hold on
%-------------------------------------------------------------------
%--------------------------------------------------------------------------
%最小包容圆轨迹
window=4;%设定滑动窗口大小
point=1;
for point =1:size(ave_rou,2)-(window-1)
%调用最小包含圆函数,画圆圈和轨迹
xw =ave_rou(point:point+window-1)
yw =NaN_ratio(point:point+window-1)
X=[xw,yw]
M=XC(xw,yw);
Mx(point)=M(1);
My(point)=M(2);
D(point)=M(3);
% plot(xw,yw,'*b')
%plotminicir(xw,yw);
end
plot(Mx(:),My(:),'-m','LineWidth',3)%轨迹
%----------------------------------------------------------------
function nargout=XC(xw,yw)
x=xw;
y=yw;
plot(x,y,'*b');hold on;
grid on%
set_3P=nchoosek(1:length(x),3);
AI=set_3P(1,1);
BI=set_3P(1,2);
CI=set_3P(1,3);
A=[x(AI) y(AI)];
B=[x(BI) y(BI)];
C=[x(CI) y(CI)];
while 1
R=minCirclePoints3(A,B,C);
cr=[R(1),R(2)];
r=zeros(1,length(x));
for i=1:length(x)
r(i)=sqrt((x(i)-cr(1))^2+(y(i)-cr(2))^2);
end;
maxValue=max(r);
[mc]=find(maxValue==r);
if r(mc)<=R(3)
alpha=0:pi/20:2*pi;%角度[0,2*pi]
plot(cr(1)+R(3)*cos(alpha),cr(2)+R(3)*sin(alpha),'--b');%中心点在(R(1),R(2))半径为R(3)的圆
plot(cr(1),cr(2),'sb');
nargout =[cr(1),cr(2),R(3)]
axis equal;
break;%所有点都被圆覆盖
else
%距离圆心最远的点在圆外
end;
D=[x(mc),y(mc)];
P=[A;B;C;D];%保存这四个点的坐标
DI=mc;
set_3P=nchoosek([AI,BI,CI,DI],3);
rSet=[];
length(set_3P)
for i=1:length(set_3P)
A=[x(set_3P(i,1)) y(set_3P(i,1))];
B=[x(set_3P(i,2)) y(set_3P(i,2))];
C=[x(set_3P(i,3)) y(set_3P(i,3))];
R=minCirclePoints3(A,B,C);
rSet=[rSet;[R,i]];%每行:圆心坐标,半径,第几组(每组包括随机的三个点)
end;
rSet=sortrows(rSet,3)%按照半径排序
% 在四个圆中找一个最小半径圆包含这四个点
for i=1:size(rSet,1)
for j=1:4
if sqrt((rSet(i,1)-(P(j,1) ))^2+ ( rSet(i,2)-(P(j,2)))^2) >rSet(i,3)
break;
end
end;
if j>4
break;
end;
end;
mc=rSet(i,4);
A=[x(set_3P(mc,1)) y(set_3P(mc,1))];
B=[x(set_3P(mc,2)) y(set_3P(mc,2))];
C=[x(set_3P(mc,3)) y(set_3P(mc,3))];
end;