MATLAB中的Sierpinski三角形

时间:2018-07-01 12:05:47

标签: matlab fractals

我已经写了以下代码,但是我似乎缺少了一些东西,我不确定它是什么:

axis off

hold on

for i = 1:10000

    r = [rand() rand()];

    rp = [(1 - sqrt(r(1))) * -1 + (sqrt(r(1)) * (1 - r(2))) * 0 + (sqrt(r(1)) * r(2)) * 1,
        (1 - sqrt(r(1))) * 0 + (sqrt(r(1)) * (1 - r(2))) * sqrt(3) + (sqrt(r(1)) * r(2)) * 0];

    v1 = [-1 0 1];
    v2 = [0 sqrt(3) 0];
    num = randi([1 3], 1);
    rv = [v1(num) v2(num)];

    mid_x = (rp(1) + rv(1))/2;
    mid_y = (rp(2) + rv(2))/2;
    plot(mid_x, mid_y, '.r', 'MarkerSize', 0.000001)

end

这就是我要得到的:

三角形

有人知道如何解决吗?

1 个答案:

答案 0 :(得分:1)

我看到两个问题:

  1. 您每次在循环中都将r重置为随机值,并且 then 进行了一次计算,将其放置在出现在下面的三个子三角形之一中你的形象。而不是这样做,您应该每次根据其先前值重新定义r。这通常是迭代背后的基本思想。

  2. 我不确定涉及平方根的计算用于什么。 Sierpinski三角形的基本计算只是将当前点r移动到一半随机选择的三角形的三个顶点之一的一半。正确定义了mid_xmid_y

考虑到所有这些,我们得到的东西看起来像这样:

axis off
hold on
r = [rand() rand()];          % Define initial value of r outside the loop
v1 = [-1 0 1];
v2 = [0 sqrt(3) 0];
for i = 1:10000
    num = randi([1 3], 1);
    rv = [v1(num) v2(num)];
    mid_x = (r(1) + rv(1))/2;
    mid_y = (r(2) + rv(2))/2;
    r = [mid_x mid_y];        % Redefine r each time through the loop
    plot(mid_x, mid_y, '.r', 'MarkerSize', 0.000001)
end

enter image description here