使用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)

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

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);

基于new BIng的修改:
你的代码有以下几个问题:

你没有定义n,而是用一个循环来尝试生成nh个圆形,但是如果循环次数超过10000,就会停止,可能导致没有生成足够的圆形。
你没有定义k1和k2,而是用km和kh代替,但是这两个变量的含义不清楚,也没有注释说明。
你没有检查圆形是否超出了网格的边界,可能导致部分圆形被截断。
你没有考虑到圆形面积服从正态分布的要求,而是用一个固定的半径rr来生成所有的圆形。

function producestructure()
 
clc;
clear all;
nx=256; % 网格大小
ny=256;
 
p=zeros(nx,ny); % 初始化网格
 
vr=0.04; % 圆形面积占总面积的比例
 
nxy=nx*ny; % 总面积
 
hn=nxy*vr; % 圆形总面积
 
n=11; % 圆形个数
 
r_mean=sqrt(hn/n/pi); % 圆形平均半径
r_std=r_mean/10; % 圆形标准差
 
k1=1; % 圆外数字
k2=0.048; % 园内数字
 
distt=8; % 圆之间的最小距离
bddis=10; % 圆距离边界的最小距离
 
hc=zeros(n,2); % 存储圆心坐标
 
p=p+k1; % 填充圆外数字
     
for k=1:n
    
    r = max(0, normrnd(r_mean,r_std)); % 根据正态分布生成随机半径
    
    [x0,y0] = random_circle(nx,ny,r,distt,bddis,hc,k); % 生成随机圆心
    
    if x0==-1 && y0==-1 % 如果没有找到合适的位置
        disp(['无法生成第',num2str(k),'个圆,请调整参数']);
        return;
    end
    
    hc(k,1)=x0; % 存储圆心坐标
    hc(k,2)=y0;
    
    for m=1:ny
        for n=1:nx
            D=((n-x0)^2+(m-y0)^2)^0.5; % 计算距离
            if(D<r) 
                p(m,n)=k2; % 填充园内数字
            end
        end
    end
    
end
 
pcolor(p); % 绘制图像
 
shading interp;
        
fn=fopen('k.txt','w'); % 打开文件
 
for m=1:ny
    for n=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) % 显示差分的大小


```python
import numpy as np
# 网格大小
n_rows = 256
n_cols = 256
# 圆形面积占总面积的比例
vr = 0.1
# 正态分布的半径
radii = np.random.normal(loc=50, scale=10, size=1000)
# 圆外数字
k1 = 0
# 圆内数字
k2 = 1
# 生成n个不重叠的圆形数字矩阵
def generate_circles(radii, n, n_rows, n_cols, k1, k2):
    circles = np.zeros((n_rows, n_cols))
    for i in range(n):
        x = np.random.randint(radii[i], n_cols - radii[i])
        y = np.random.randint(radii[i], n_rows - radii[i])
        circle = np.zeros((n_rows, n_cols))
        for j in range(n_rows):
            for k in range(n_cols):
                if (j - y) ** 2 + (k - x) ** 2 <= radii[i] ** 2:
                    circle[j, k] = k2
                else:
                    circle[j, k] = k1
        circles += circle
    return circles
# 生成数字矩阵并写入txt文件
def generate_matrix(filename):
    circles = generate_circles(radii, 100, n_rows, n_cols, k1, k2)
    with open(filename, 'w') as f:
        for i in range(n_rows):
            for j in range(n_cols):
                f.write(str(int(circles[i, j])) + '\n')
# 测试
generate_matrix('matrix.txt')

```
以上代码将生成一个256*256的数字矩阵,其中包含100个不重叠的圆形,每个圆形的半径服从正态分布。每个圆形内的数字为k2,圆形外的数字为k1。最终的数字矩阵将写入名为matrix.txt的txt文件中,其中每行为一个数字。

朋友您好,以下是我把您的问题和相关观点都看了一遍分析出来的,望采纳谢谢啦
这个错误提示意味着在您的代码中,变量或函数 random_circle 被调用时未被定义或声明。这可能是因为该变量或函数名的拼写有误、该变量或函数在文件中的位置不正确、或者该变量或函数未在程序中定义。

要解决此错误,您可以尝试以下几种方法:

检查变量或函数名称的拼写:检查您使用的变量名或函数名是否与其在程序中定义的名称匹配。如果有拼写错误,则可纠正该错误。

声明变量或函数:如果变量或函数未在程序中定义,则需要在程序中声明它们。您可以在程序中添加一个变量声明语句,例如 var random_circle; 或添加一个函数声明语句,例如 function random_circle() {...}。

确保变量或函数在正确的位置:如果变量或函数已经定义了,但仍然遇到此错误,则很可能是因为它们不在程序的正确位置。请确保变量或函数在程序的范围内定义(如在全局范围内定义)或在程序中正确的位置定义(如在函数内部定义)。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^