matlab - 用matlab画谢尔宾斯基三角形的高效代码

标签 matlab recursion fractals

以下是我的代码:

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)

效果不是很好。我想先生成所有数据然后打补丁,但我不知道如何正确使用。另外,我的代码可以写成使用循环吗?

最佳答案

您编写一个函数来生成数据并编写另一个函数来绘制数据的想法是个好主意 - 将数据生成与处理以及处理与输出分开通常是个好主意。我会这样做:

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 的结构,其中的每个条目都包含 sierpinski 三角形中的一个小三角形的坐标。你绘制它的代码可能看起来像

>> 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

关于matlab - 用matlab画谢尔宾斯基三角形的高效代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18715527/

相关文章:

c - 简单递归题

c++ - Julia 设置 C++ 颜色

mysql - 数据库资源管理器未看到 MySQL J Connect "Unable to find JDBC driver file on MATLAB Java class path"

matlab - 在没有 'for' 循环的情况下使匹配和追加代码更高效

matlab - 在 MATLAB 中将两个 2 向量相乘时出现数字类型错误

php - 如何在数据库中实现文件夹,子文件夹

java - 拓扑排序与DFS的区别仅在于递归调用后对当前元素进行处理

c - Hopalong 分形,检查 C 语法

matlab - 在 Matlab GUI 中加载图像流