在绘图MATLAB中创建分形图像,但绘图是空的

时间:2016-05-05 15:57:17

标签: 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)

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

1 个答案:

答案 0 :(得分:3)

是的...它是您的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值运行您的功能,但是您尝试在x循环中访问此yfor如果这些是数组。我假设这是递归,因此您需要在X条件中实际使用Yif/else而不是xy
  2. 由于您使用的是单个值,因此使用:访问第二个维度是多余的。把它留下来吧。
  3. 您创建XY,但随后覆盖X作为2D数组的起始位置...我认为您打算替换X和{{ 1}}&#39;第一个元素,而不是起始位置。
  4. 我认为您的第一个Y声明不正确。鉴于到目前为止代码的行为,您是否想要访问if而非Y(i)否?...
  5. 你的第一个条件肯定会让你感到困惑。这就是说,只要该值大于或等于0.01,就执行该语句。否则,尝试并执行其他可能实际上永远不会起作用的条件,因为您正在寻找大于0.01的值,而第一个条件已经为您处理了这些值。我假设你打算检查它是否 而不是0.01。
  6. 在MATLAB中执行Y(1)表示此语句为真,前提是数组中的任何一个值与value comparecondition array提供的条件匹配。这会对您当前的代码产生意想不到的副作用。
  7. 确保每个value语句所涵盖的范围是连续的(即范围之间没有间隙或断开连接)。现在,您正在检查0.01间隔的值。 if生成0到1之间的随机值。如果您的值为0.15怎么办?您的rand条件都没有处理此问题,因此您需要使用我上面谈到的内容。
  8. 您最有可能获得空白图,因为您的if属性非常小....您将其设置为1像素。除非你有超人的视力,否则你无法真实地想象这一点。将MarkerSize放大。
  9. MarkerSize之后使用drawnow;立即将结果更新为屏幕。
  10. 因此,通过重构代码,您应该看起来像这样:

    plot

    当我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 时,我现在得到这个数字:

    enter image description here

    ....很酷的分形btw!