image - 在 MATLAB 绘图中创建分形图像,但绘图为空

标签 image matlab plot fractals

我正在编写一个函数来在绘图中创建分形图像。当我运行代码时,会弹出一个图,但它是空的。我认为问题出在我的 if/elseif 语句中,但我很难找到它。我的代码是:

function [] = fractal(x, y, N)
close all
start = [x, y];
X = zeros(N+1,1);
Y = zeros(N+1,1);
X = start;
hold on
for i = 1:N
prob = rand;
if prob >= 0.01
    X(i+1,:) = 0;
    Y(i+1,:) = 0.16*y(1);
elseif prob == 0.02:0.86
    X(i+1,:) = (0.85*x(i))-(0.04*y(i));
    Y(i+1,:) = (-0.04*x(i))+(0.85*y(i))+1.6;
elseif prob == 0.87:0.94
    X(i+1,:) = (0.2*x(i))-(0.26*y(i));
    Y(i+1,:) = (0.23*x(i))+(0.22*y(i))+1.6;
elseif prob == 0.95:1.0
    X(i+1,:) = (-0.15*x(i))+(0.28*y(i));
    Y(i+1,:) = (0.26*x(i))+(0.24*y(i))+0.44;
plot(X(i,:),Y(i,:),'.','Markersize',1)
axis equal 
    end
end
end

当我运行代码时

>> fractal(1,1,1000)

...出现了一个情节,但它是空的。

最佳答案

是的...这是您的 if 语句,但您的代码还有更多问题,但我们稍后会解决这些问题。让我们首先解决您的 if 语句。例如,如果要比较一系列值,则需要使用 AND (&&) 语句。此外,您应该将 plot 代码放置在任何 if/elseif/else 语句之外。目前,您已将其包含在最后一个 elseif 语句中,因此只有满足最后一个条件时 plot 才会运行。

明确地说,如果您希望比较某个值是否在某个范围内,请执行以下操作:

if (prob >= a && prob < b)

对于elseif:

elseif (prob >= a && prob < b)

ab 是您要比较的下限和上限。这在比较中包括 a排除 b

为了使其正常工作,我还对您当前的代码提出了一些意见和建议:

  1. 您使用单个 xy 值运行函数,但您试图访问此 xy 在您的 for 循环中,就好像它们是数组一样。我假设这本质上是递归,因此您需要在 if/else 中实际使用 XY > 条件而不是 xy
  2. 由于您使用的是单个值,因此使用 : 来访问第二个维度是多余的。把它忽略掉即可。
  3. 您创建了 XY,但随后覆盖 X 作为二维数组的起始位置...我认为您的意思是将 XY 的第一个元素替换为起始位置。
  4. 我认为您的第一个 if 语句不正确。您想要访问 Y(i) 而不是 Y(1) 不是吗?...考虑到您迄今为止的代码行为。
  5. 你的第一个条件肯定会把事情搞砸。这就是说,只要该值大于或等于0.01,就执行该语句。否则,尝试执行其他条件,这些条件实际上可能永远不会起作用,因为您正在寻找大于 0.01 的值,而第一个条件已经为您处理了该值。我假设您的意思是检查它是否小于小于 0.01。
  6. 在 MATLAB 中执行值比较条件数组意味着,如果数组中的任何一个值提供的条件匹配,则此语句为真>。这会对您当前的代码产生意想不到的副作用。
  7. 确保每个 if 语句涵盖的范围是连续的(即范围之间没有间隙或脱节)。现在,您正在检查 0.01 间隔内的值。 rand 生成 0 到 1 之间的随机值(不包括 0 和 1)。如果值为 0.15 会怎样?您的 if 条件都无法处理此问题,因此您需要使用我上面谈到的内容。
  8. 您很可能会得到一个空白图,因为您的 MarkerSize 属性非常小......您将其设置为 1 像素。除非你有超人的视力,否则你无法真正想象这一点。将 MarkerSize 调大。
  9. plot后使用drawnow;立即将结果更新到屏幕上。

因此,通过重构代码,您应该使其看起来像这样:

function [] = fractal(x, y, N)
close all
start = [x, y];
X = zeros(N+1,1);
Y = zeros(N+1,1);
%// Change - Initialize first elements of X and Y to be the starting positions
X(1) = start(1);
Y(1) = start(2);
hold on
for i = 1:N
    prob = rand;
    if prob <= 0.01 %// Change
        X(i+1) = 0;
        Y(i+1) = 0.16*Y(i); %// Change
    elseif (prob > 0.01 && prob <= 0.86) %// Change
        X(i+1) = (0.85*X(i))-(0.04*Y(i)); %// Change
        Y(i+1) = (-0.04*X(i))+(0.85*Y(i))+1.6; %// Change
    elseif (prob > 0.86 && prob <= 0.94) %// Change
        X(i+1) = (0.2*X(i))-(0.26*Y(i)); %// Change
        Y(i+1) = (0.23*X(i))+(0.22*Y(i))+1.6; %// Change
    elseif (prob > 0.94 && prob <= 1.0) %// Change
        X(i+1) = (-0.15*X(i))+(0.28*Y(i)); %// Change
        Y(i+1) = (0.26*X(i))+(0.24*Y(i))+0.44; %// Change
    end

    %// Change - move outside of if/else blocks
    %// Also make marker size larger
    plot(X(i),Y(i),'.','Markersize',18); %// Change
    axis equal 

    %// Add just for kicks
    drawnow;
end

end

现在,当我执行fractal(1,1,1000)时,我得到了这个数字:

enter image description here

....顺便说一句,很酷的分形!

关于image - 在 MATLAB 绘图中创建分形图像,但绘图为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37055024/

相关文章:

r - 更改 R 中矩阵的 image() 图中的原点

image - 顶部标题 Img 留在计算机上 & 中心在手机和平​​板电脑上

ios - 导航栏项目图标未正确显示

css - 三个图像水平 w/响应式设计

matlab - 向量到行总和为 1 的矩阵

matlab - 如何在matlab中根据条件提取矩阵的行

python - 如何在中心绘制子图并使颜色条与其中一个子图的长度相同?

r - ggplot2 传递变量以绘制函数

android - 如何在图像缩放android中捏缩放图像?

matlab - 如何将结构中的变量加载到 Matlab 工作区中?