全国大学生数学建模竞赛2001a赛题matlab代码分享

本文分享了2001年A赛题的MATLAB代码,供数学建模爱好者参考,代码为原创,建议上机验证运行效果。

话不多说,直接上代码

for num_graph=0:5:99    %每隔5张图片画一个边界图,这样看得更清楚
    s1='C:\Users\86135\Desktop\competition\2001\2001aphoto\'
    s2=int2str(num_graph)
    s3='.bmp'
    s=strcat(s1,s2,s3)
    graphN=imread(s)    %读入位图
    edgeN=edge(graphN,'log')    %求出边界点
    for i =1:512
        for j=1:512
            if edgeN(i,j)==1
                plot3(j,512-i,num_graph,'.')
                hold on
            end
        end
    end
end
axis equal
box on
tic    %记录运行时间
mat_maxR=[]
mat_meanC0=[]
for l=0:99
    graphN=[]
    edgeN=[]
    x=[]
    y=[]
    co=[]
    s1='C:\Users\86135\Desktop\competition\2001\2001aphoto\'
    s2=int2str(l)
    s3='.bmp'
    s=strcat(s1,s2,s3)
    graphN=imread(s)
    edgeN=edge(graphN,'log')
    [x,y]=find(edgeN==1)
    leftLine=min(y)+28
    topLine=min(x)+28
    rightLine=max(y)-28
    bottomLine=max(x)-28
    maxR=0;
    meanC0=[0;0]
    for r=28:32
        r2=r^2
        co=[]
        isfind02=0    %isfind02是否为最大内切圆
        for i =topLine:bottomLine    %从上到下
            for j=leftLine:rightLine    %从左到右搜索圆心坐标
                isfind0=1
                if graphN(i,j)==0
                    for k=1:length(x)
                        dist=(x(k)-i)^2+(y(k)-j)^2
                        if dist<r2    %当边界点在圆内,则跳出循环
                            isfind0=0    %isfind0为0表示(i,j)不是圆心
                            break
                        end
                    end
                    if isfind0==1    %isfind0为1表示(i,j)是圆心
                        isfind02=1    %设置标识,找到内切圆
                        co=[co,[i;j]]    %存下数据
                    end
                end
            end
        end
        if isfind02==1    %如果找到内切圆,则记下圆心和半径值
            meanC0=round([mean(co(1,:));mean(co(2,:))])
            maxR=r
        else
            break    %如果不是最大内切圆,则停止搜索
        end
    end
    mat_meanC0=[meanC0,mat_meanC0]    %存储全部的圆心坐标
    mat_maxR=[mat_maxR,maxR]    %存储全部的100个半径值
end
toc    %记录运行时间
m=[257;96]
n=[244;445]    %增加两个位点,使三次B样条曲线过初始点和终点
mat_meanC0=[m mat_meanC0 n]
for i =1:99
    x0=mat_meanC0(1,i)    
    x1=mat_meanC0(1,i+1)
    x2=mat_meanC0(1,i+2)
    x3=mat_meanC0(1,i+3)
    y0=mat_meanC0(2,i)
    y1=mat_meanC0(2,i+1)
    y2=mat_meanC0(2,i+2)
    y3=mat_meanC0(2,i+3)
    z0=i-2
    z1=i-1
    z2=i
    z3=i+1
    a0=(x0+4*x1+x2)/6    %设置a0,a1,a2,a3的数值
    a1=(x2-x0)/2
    a2=(x0-2*x1+x2)/2
    a3=(x0-3*x1+3*x2-x3)/(-6)
    b0=(y0+4*y1+y2)/6
    b1=(y2-y0)/2
    b2=(y0-2*y1+y2)/2
    b3=(y0-3*y1+3*y2-y3)/(-6)
    c0=(z0+4*z1+z2)/6
    c1=(z2-z0)/2
    c2=(z0-2*z1+z2)/2
    c3=(z0-3*z1+3*z2-z3)/(-6)
    Bx=[]
    By=[]
    Bz=[]
    for t=0:0.1:1
        bx=a0+a1*t+a2*t^2+a3*t^3
        by=b0+b1*t+b2*t^2+b3*t^3
        bz=c0+c1*t+c2*t^2+c3*t^3
        Bx=[Bx bx]
        By=[By by]
        Bz=[Bz bz]
    end
    plot3(Bx,By,Bz)    %画出图像
    hold on
end
xlabel('x')
ylabel('y')
zlabel('z')
axis equal

本代码为本人手打,运行结果请自行上机演示。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HeadmasterSong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值