半沉浮 2023-04-14 12:11 采纳率: 50%
浏览 105
已结题

使用matlab或python绘制图像并输出为txt文件

img

如图设置一个网格大小为256*256的点阵;
vr为圆形面积占总面积的比例;
r为圆形半径;
k1为圆外数字;
k2为园内数字;

需要生成n个不重叠的圆形数字矩阵,且圆形面积服从正态分布。(可以自定义k1和k2数字大小)
最后将其输出为txt文件,且一个数字为一行。

我原来写的是下面这样,所有的圆形都是相同半径

function producestructure()

clc;
clear all;
nx=256;
ny=256;

p=zeros(nx,ny);

vr=0.04;


nxy=nx*ny;

hn=nxy*vr;

nh=11;

rr=((hn/nh)/pi)^0.5;



km=1;

kh=0.048;  %圆内
distt=8;

nk=1;

bddis=10;


for n=1:1:10000
    
    x0=floor(rr+bddis+ (nx-2*rr-2*bddis)*rand);
    y0=floor(rr+bddis+ (ny-2*rr-2*bddis)*rand);
    
    if(n==1) 
        hc(nk,1)=x0;
        hc(nk,2)=y0;
    end
    tr=1;
    if(n>1)
        
        for i=1:1:nk

            D=((x0-hc(i,1))^2+(y0-hc(i,2))^2)^0.5;

            if(D<(2*rr+distt))
                tr=0;
            end
        end
       end
        
        if(tr>0)
        nk=nk+1;
        hc(nk,1)=x0;
        hc(nk,2)=y0;
        disp([x0  y0])
        end
    
    
    if(nk==nh) break; end
    
end


if(nk==nh)

p=p+km;     

for k=1:1:nh
    
    for m=1:1:ny
        for n=1:1:nx
            D=((n-hc(k,1))^2+(m-hc(k,2))^2)^0.5;
            if(D<rr) 
                p(m,n)=kh;
            end
        end
    end
    
end


pcolor(p);

shading interp;
        
else
    disp(['please change dis for more point']);
end
        
        
fn=fopen('k.txt','w');

    for m=1:1:ny
        for n=1:1:nx
            fprintf(fn,'%f\n',p(m,n));
        end
    end
fclose(fn) ;   
    

df=0.01*(diff(p,2,2)+diff(p,2,1));
size(df)
  • 写回答

5条回答 默认 最新

  • 「已注销」 2023-04-14 13:47
    关注

    我在你的代码基础上修改后,运行结果如下:

    img


    代码如下:

    clc;
    clear all;
    nx = 256;
    ny = 256;
    
    p = zeros(nx, ny);
    
    vr = 0.04;
    
    nxy = nx*ny;
    
    hn = nxy*vr;
    
    nh = 11;
    
    rr = ((hn/nh)/pi)^0.5;
    
    km = 1;
    k2 = 0.1;
    kh = 0.048;  % 圆内数字
    k1 = 0.01;   % 圆外数字
    distt = 8;
    
    nk = 1;
    
    bddis = 10;
    
    % 生成正态分布的圆心坐标
    mu = [nx/2, ny/2];  % 均值
    sigma = [50, 50];   % 标准差
    hc = zeros(nh, 2);
    while nk <= nh
        coord = round(normrnd(mu, sigma, 1, 2));
        if all(coord > rr+bddis) && all(coord < [nx, ny]-rr-bddis)
            tr = 1;
            if nk > 1
                for i = 1:1:nk-1
                    D = ((coord(1)-hc(i,1))^2 + (coord(2)-hc(i,2))^2)^0.5;
                    if D < (2*rr+distt)
                        tr = 0;
                        break
                    end
                end
            end
            if tr > 0
                hc(nk,:) = coord;
                nk = nk+1;
            end
        end
    end
    
    for k = 1:nh
        r = randi([10,20]); % 生成10~20之间的整数作为半径
        for m = 1:ny
            for n = 1:nx
                D = ((n - hc(k,1))^2 + (m - hc(k,2))^2)^0.5;
                if (D < r)
                    if (D > r - 2) % 设置圆周边缘的宽度
                        p(m,n) = k2*(1-cos(pi*(D-r+2)/4))^2; % 通过插值平滑圆周边缘
                    elseif (D > r)
                        p(m,n) = k1;
                    else
                        p(m,n) = k2;
                    end
                end
            end
        end
    end
    p(p == 0) = k1;  % 圆外数字为 k1
    
    pcolor(p);
    shading interp;
    
    
    fn = fopen('k.txt', 'w');
    for m = 1:1:ny
        for n = 1:1:nx
            fprintf(fn, '%g\n', p(m,n));
        end
    end
    fclose(fn);
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 4月22日
  • 已采纳回答 4月14日
  • 修改了问题 4月14日
  • 修改了问题 4月14日
  • 展开全部

悬赏问题

  • ¥15 pyqt5 中python如何通过Qtwebchannel主动发消息给web前端
  • ¥15 关于HTML中title获取xml内容的问题
  • ¥15 fanuc机器人PRIO083数字信号未复原错误,如何解决?
  • ¥20 如何为现有电路板增加远程控制功能
  • ¥15 C#点击按钮的时候的循环次数就是最后一次,如何是循环第几次的值?
  • ¥15 UE5打包失败,求解决
  • ¥15 请问STM32G431的CANOPEN协议函数怎么写
  • ¥15 graphpad prism 三因素重复测定报错
  • ¥15 openbmc ast2500如何修改MCR04寄存器使用ddr4
  • ¥15 关于#LTC#的问题,如何解决?(相关搜索:示波器)