Треугольник Серпинского в MATLAB - PullRequest
0 голосов
/ 01 июля 2018

Я написал следующий код, но мне, кажется, что-то не хватает, и я не уверен, что это такое:

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 голосов
/ 01 июля 2018

Я вижу два вопроса:

  1. Вы сбрасываете r на случайное значение каждый раз в цикле, а затем выполнили вычисление, которое поместит его в один из трех подтреугольников, которые появляются на вашем изображении. Вместо того, чтобы делать это, вы должны каждый раз переопределять r с точки зрения его предыдущего значения. Это основная идея итерации в целом.

  2. Я не уверен, для чего нужны вычисления с использованием квадратного корня. Базовое вычисление для треугольника Серпинского просто перемещает текущую точку r на полпути к одной из трех вершин треугольника, которые выбираются случайным образом. Это правильно сделано в вашем определении mid_x и mid_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

...