用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,'*')%gr

来源:学生作业帮助网 编辑:六六作业网 时间:2024/11/26 20:02:41
用MATLAB实现最小圆覆盖问题!我用MALTAB实现了这样一个图形,怎样用MALTAB语句构建一个最小圆,能覆盖上面所有的九个点.这个图的语句:x=[2284513817811862]y=[3813

用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,'*')%gr
用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%

用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,'*')%gr

%  http://www.personal.kent.edu/~rmuhamma/Compgeometry/MyCG/CG-Applets/Center/centercli.htm

% 算法思路:

% 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)<=R(3)%没有点在圆外,结束回家吃饭去

        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;

    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;

%总结:根据算法我写的这个程序有个隐藏的问题,由于要看比赛了,没时间再纠正这个问题了. 

-------------------------------------------------------------------------------

function R=minCirclePoints3(A,B,C)

X=[A(1) B(1) C(1)];

Y=[A(2) B(2) C(2)];

%计算三边的长度AB BC CA

len=[sqrt((X(1)-X(2))^2+(Y(1)-Y(2))^2) sqrt((X(2)-X(3))^2+(Y(2)-Y(3))^2) sqrt((X(3)-X(1))^2+(Y(3)-Y(1))^2)];

%在非特殊情况下计算三角形三角的余弦值 cosA,cosB,cosC

if(sum(len>0)==3)

abc=[cosABC(len(2),len(1),len(3)) cosABC(len(3),len(1),len(2)) cosABC(len(1),len(2),len(3))];

end

%两点重合、三点重合、三点共线

if(len(1)==len(2)+len(3))

    r=len(1)/2;

    a=(X(1)+X(2))/2;

    b=(Y(1)+Y(2))/2;

    R=[a b r];

elseif(len(2)==len(1)+len(3))

    r=len(2)/2;

    a=(X(2)+X(3))/2;

    b=(Y(2)+Y(3))/2;

    R=[a b r];

elseif(len(3)==len(1)+len(2))

    r=len(3)/2;

    a=(X(1)+X(3))/2;

    b=(Y(1)+Y(3))/2;

    R=[a b r];

%--------------------------------------------------------------------------

else

    tmp=(abc<=0);

    if(tmp(1))

        r=len(2)/2;

        a=(X(2)+X(3))/2;

        b=(Y(2)+Y(3))/2;

        R=[a b r];

    elseif(tmp(2))

        r=len(3)/2;

        a=(X(1)+X(3))/2;

        b=(Y(1)+Y(3))/2;

        R=[a b r];

    elseif(tmp(3))

        r=len(1)/2;

        a=(X(1)+X(2))/2;

        b=(Y(1)+Y(2))/2;

        R=[a b r];

    elseif(sum(tmp)==0)

        a=(((X(1)^2-X(2)^2+Y(1)^2-Y(2)^2)*(Y(2)-Y(3)))-((X(2)^2-X(3)^2+Y(2)^2-Y(3)^2)*(Y(1)-Y(2))))/(2*(X(1)-X(2))*(Y(2)-Y(3))-2*(X(2)-X(3))*(Y(1)-Y(2)));

        b=(((X(1)^2-X(2)^2+Y(1)^2-Y(2)^2)*(X(2)-X(3)))-((X(2)^2-X(3)^2+Y(2)^2-Y(3)^2)*(X(1)-X(2))))/(2*(Y(1)-Y(2))*(X(2)-X(3))-2*(Y(2)-Y(3))*(X(1)-X(2)))  ;

        r=sqrt((X(1)-a)^2+(Y(1)-b)^2);

        R=[a b r];

    end

end

%d=linspace(0,2*pi,100);

%plot(a+r*sin(d),b+r*cos(d),'-',X(1),Y(1),'ro',X(2),Y(2),'bo',X(3),Y(3),'ko',a,b,'.')

%axis([0 10 0 10])

function c=cosABC(x,y,z)

c=(z^2+y^2-x^2)/(2*z*y);

end

end

用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,'*')%gr 用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,'*')%gr matlab能否画多坐标轴的图?我遇到的问题时,作图时,需要一个横坐标轴,四个纵坐标轴,请问用matlab能否实现 matlab数据拟合问题我想要拟合y=a*x1+b*x2+c形式的曲线,用matlab如何实现? 如图将三角形abc放在每个小正方形边长为一的网格中,点abc都在格点上,用一个圆面去覆盖能完全覆盖这个三角形的最小圆面半径 用matlab 编程计算通信卫星覆盖地球的面积 求matlab高手实现 问题补充的算法,用for语句 双层循环吧 matlab函数表示用matlab怎么实现啊谢谢 灰度共生矩阵怎么用MATLAB实现? 怎么样用matlab实现sift算法 怎么用Matlab实现椭圆拟合? 用matlab实现傅里叶正逆变换源程序 Matlab实现假设检验我要用Matlab实现卡方检验,但是对这个软件几乎一窍不通,连怎么把数据读进去都不清楚, matlab 颜色覆盖问题在MATLAB做实时动画的过程中遇到以下问题,首先我是将画图背景改成白色,然后运用RGB设置颜色,在此时做实时动画的过程中就会有颜色覆盖的问题,用设置好的颜色来画图却 如何用粒子群算法实现有障碍物时的最短路径规划(从起点到终点路径最短,并避开障碍物),用Matlab实现!大家帮帮忙啊!最后要能画图显示!回答一经采用,加分不是问题!谢谢! 有限覆盖定理中为什么要用开区间覆盖而不用闭区间覆盖用闭区间覆盖会出现什么问题 遗传算法matlab编程求函数最大值?我们现在要用MATLAB编程实现遗传算法求解函数最大值问题,不能用MATLAB自带的遗传算法工具箱.现在有个问题就是,要求函数是一个变量X的话,程序我已经编了,但 非线性规划问题,比如斐波那契法,梯度法这些,是不是要用matlab实现,lingo可以么