Algorithm 一种实现高阶分形的算法

Algorithm 一种实现高阶分形的算法,algorithm,matlab,fractals,Algorithm,Matlab,Fractals,我试图为n阶Koch分形编写一个代码,定义如下: 为此,我在Matlab中实现了一个代码。我已经能够开发一个能够绘制二阶分形的代码(尽管零阶和一阶非常简单)。为此,我将代码基于。到目前为止,我已经得到了这个,这是有效的,但显然只是为了二阶(或者一阶和零阶,只是编辑一点代码) 我知道这不是一个干净和最佳的代码。我只是对任何能帮助我建立n阶Koch分形的技巧感兴趣,只是改变n的值 感谢您的帮助 您当然可以改进您的算法,特别是利用矢量化将计算减少到单个for循环(并使其易于扩展到任何顺序)。您甚至不需

我试图为n阶Koch分形编写一个代码,定义如下: 为此,我在Matlab中实现了一个代码。我已经能够开发一个能够绘制二阶分形的代码(尽管零阶和一阶非常简单)。为此,我将代码基于。到目前为止,我已经得到了这个,这是有效的,但显然只是为了二阶(或者一阶和零阶,只是编辑一点代码)

我知道这不是一个干净和最佳的代码。我只是对任何能帮助我建立n阶Koch分形的技巧感兴趣,只是改变n的值


感谢您的帮助

您当然可以改进您的算法,特别是利用矢量化将计算减少到单个for循环(并使其易于扩展到任何顺序)。您甚至不需要递归(尽管这是另一种选择)。这是一个矢量化函数
koch

function [x, y] = koch(N, x, y)
  R = [cosd(60) -sind(60); sind(60) cosd(60)];
  x = x(:).';
  y = y(:).';
  for iOrder = 1:N  % Loop N times
    x1 = x(1:(end-1));
    x5 = x(2:end);
    x2 = (2.*x1+x5)./3;
    x4 = (x1+2.*x5)./3;
    y1 = y(1:(end-1));
    y5 = y(2:end);
    y2 = (2.*y1+y5)./3;
    y4 = (y1+2.*y5)./3;
    temp = R*[x4-x2; y4-y2];
    x = [x1; x2; x2+temp(1, :); x4];
    y = [y1; y2; y2+temp(2, :); y4];
    x = [x(:).' x5(end)];
    y = [y(:).' y5(end)];
  end
end
对于每次迭代中的一组
M
点(包括
x
y
),每条线的起点由
x(1:(M-1))
给出,终点由
x(2:M)
给出。您可以通过构建一个4乘M-1矩阵将3个新点交错在这3个点之间,其中最上面的一行是您的起点,每个连续的一行是3个新点中的一个(按链接计算)。使用
(:)。
(并添加最后一个端点)重塑生成的矩阵将为直线提供一组1×4*M-3的点,可供下一次迭代使用

下面是正在运行的代码:

[x, y] = koch(0, [0 1], [0 0]);
plot(x, y);
axis equal;
hold on;
[x, y] = koch(1, x, y);  % or [x, y] = koch(1, [0 1], [0 0]);
plot(x, y);
[x, y] = koch(1, x, y);  % or [x, y] = koch(2, [0 1], [0 0]);
plot(x, y);
[x, y] = koch(1, x, y);  % or [x, y] = koch(3, [0 1], [0 0]);
plot(x, y);
legend({'0' '1' '2' '3'});


请注意,您可以通过传递
n
和您的起点或传递
1
n-1
第次分形的点来获得
n
第次分形。

递归是您的朋友。顺便说一句,网上已经有几个例子了。只需搜索科赫曲线matlab。这真的很有帮助!我考虑过点的插值,但不确定如何实现它。谢谢你这么有帮助的回答@gnovice@Zarauztarra例如我进步了。我在与前一个版本一致的地方创建了冗余点。这个新版本去掉了。哇,真不错。我检查了编辑,也意识到了这一点。谢谢你改变它!
[x, y] = koch(0, [0 1], [0 0]);
plot(x, y);
axis equal;
hold on;
[x, y] = koch(1, x, y);  % or [x, y] = koch(1, [0 1], [0 0]);
plot(x, y);
[x, y] = koch(1, x, y);  % or [x, y] = koch(2, [0 1], [0 0]);
plot(x, y);
[x, y] = koch(1, x, y);  % or [x, y] = koch(3, [0 1], [0 0]);
plot(x, y);
legend({'0' '1' '2' '3'});