2013-09-10 3 views
2

После мой код:Эффективный код нарисовать треугольник Серпинского с MATLAB

function sierpinski(A, B, C, n) 
    if n == 0 
     patch([A(1), B(1), C(1)], [A(2), B(2), C(2)], [0.0 0.0 0.0]); 
    else 
     sierpinski(A, (A + B)/2, (A + C)/2, n-1); 
     sierpinski(B, (B + A)/2, (B + C)/2, n-1); 
     sierpinski(C, (C + A)/2, (C + B)/2, n-1); 
end 

% sierpinski([0 0], [1 0], [.5 .8], 8) 

Это не очень effectly. Сначала я хочу, чтобы все данные были заархивированы, но я не знаю, как правильно их использовать. Кроме того, может ли мой код быть написанным для петель?

+0

Проведите некоторое исследование, поисковая система должна предложить вам решения 'O (10)'. –

+0

@HighPerformanceMark Я не думаю, что это справедливо - OP уже разобрался, как построить треугольник sierpinski (их код работает, но медленный из-за 6000 звонков на «patch»), и они спрашивают, как они могут генерировать все данные раздельно, а затем запишите его. –

ответ

6

Ваша идея написать одну функцию для генерации данных, а другая для ее построения - хорошая - часто бывает полезно отделить генерацию данных от обработки и обработки с выхода. Я хотел бы сделать это что-то вроде этого:

function out = sierpinski(a, b, c, n) 

    if n == 0 
     out.xvals = [a(1), b(1), c(1)]; 
     out.yvals = [a(2), b(2), c(2)]; 
    else 
     out1 = sierpinski(a, (a+b)/2, (a+c)/2, n-1); 
     out2 = sierpinski(b, (a+b)/2, (b+c)/2, n-1); 
     out3 = sierpinski(c, (a+c)/2, (b+c)/2, n-1); 
     out = [out1, out2, out3]; 
    end 

end 

Это создает на структуру длины 3^n, каждая запись которого содержит координаты одной из маленьких треугольников в треугольнике Серпинского. Ваш код для построения может выглядеть следующим

>> out = sierpinski([0,0], [1,0], [0.5, sqrt(3)/2], 8); 
>> figure(); hold on; 
>> for i = 1:length(out) 
     patch(out(i).xvals, out(i).yvals, 'k'); 
    end 

что падает на моей машине (кажется, что Matlab не обрабатывает тысячи заплат на том же участке очень хорошо), но подобный цикл, который строит одну точку на угол каждого малого треугольника.

>> x = [out.xvals]; 
>> y = [out.yvals]; 
>> plot(x, y, '.'); 

, который производит этот участок

enter image description here

+0

Спасибо за помощь. – mathe

+0

Могу ли я получить помощь? Я хочу сделать тот же треугольник, но не получаю код. даже как добавить его в файл. могу ли я получить код по электронной почте или здесь. что-то вроде того ? –

+0

Код уже в моем ответе. Если вы объясните, что это такое, вы не понимаете, то, может быть, я могу помочь, но просто говоря: «Я не получаю код», вы не получите слишком далеко. –

0

у меня нет никаких кодовых примеров готов, но:

Вместо того чтобы рисовать каждый треугольник в виде одного патч-объекта, может попытаться рисовать все треугольники в одном большом патче. В основном вам нужно будет только объединить координаты x и y для каждого треугольника, разделенного NaN - это не позволит патчу рисовать линии, соединяющие отдельные треугольники. . следующая строка производит два отдельных треугольников:

p = patch([0 0.5 1 0 NaN 2 2.5 3 2 NaN ], [ 0 1 0 0 NaN 2 3 2 2 NaN], 'k')

виду, что, чтобы иметь замкнутый треугольник вам нужно 4 очка за треугольником этот путь, последний пункт является идентичным первому.