MATLAB找离散点最小包络圆,求点集的最小包含圆求不出来,求高人问路……

%这个我想求数据集的最小包含圆

%用数据集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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值