用MATLAB实现最小圆覆盖问题!我用 MALTAB实现了这样一个图形,怎样用MALTAB语句构建一

发布时间:2021-02-26 06:49:59

用MATLAB实现最小圆覆盖问题!我用 MALTAB实现了这样一个图形,怎样用MALTAB语句构建一个最小圆,能覆盖上面所有的九个点.这个图的语句:x=[22 8 4 51 38 17 81 18 62]y=[38 13 81 32 11 12 63 45 12]plot(x,y,'*')%grid on%用程序实现最小覆盖圆,并显示圆点坐标及半径,一个最优的记得遗传算法貌似可以吧

网友回答

PS:你上个问题(聚类问题)不应该结题的,因为我并没理解你的问题所在,所以也没有给出正确答案.主要是你的聚类特征不明确,我没法帮你进行聚类.任何聚类都需要设定聚类特征,而你问题中并没有说明.这个问题你问了两遍,...
======以下答案可供参考======
供参考答案1:
% 算法思路:
% 1. 在点集中任取3点A,B,C。
% 2. 作一个包含A,B,C三点的最小圆,圆周可能通过这3点,也可能只通过其中两点,但包含第3点.后一种情况圆周上的两点一定是位于圆的一条直径的两端。
% 3. 在点集中找出距离第2步所建圆圆心最远的D点,若D点已在圆内或圆周上,则该圆即为所求的圆,算法结束.否则执行第4步。
% 4. 在A,B,C,D中选3个点,使由它们生成的一个包含这4个点的圆为最小,这3 点成为新的A,B,C,返回执行第2步。
% 若在第4步生成的圆的圆周只通过A,B,C,D 中的两点,则圆周上的两点取成新的A和B,从另两点中任取一点作为新的C。
clear all;close all;clc;
x=[22 8 4 51 38 17 81 18 62]
y=[38 13 81 32 11 12 63 45 12]
plot(x,y,'*');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); %或者N=max(r(:))
[mc]=find(maxValue==r);
if r(mc) alpha=0:pi/20:2*pi;%角度[0,2*pi]
plot(cr(1)+R(3)*cos(alpha),cr(2)+R(3)*sin(alpha),'--r');%中心点在(R(1),R(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=[]; 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%第i组三个点产生的圆可行--必然可以找到一个 break; end;
以上问题属网友观点,不代表本站立场,仅供参考!