填写Sierpinski三角形

时间:2015-12-08 15:24:22

标签: matlab

我希望创建填充的Sierpinski三角形。相反,我的代码生成一个背景填充的Sierpinski三角形。换句话说,我该如何反转颜色?请参阅以下代码:

function out = sierpinski(a, b, c, n)
M1 = (a+b)/2;
M2 = (b+c)/2;
M3 = (a+c)/2;
k = [M1(1), M2(1), M3(1)];
m = [M1(2), M2(2), M3(2)];
if n==0
    out.x=[a(1), b(1), c(1)];
    out.y=[a(2), b(2), c(2)];
    patch(out.x,out.y,'r')  % choosing the color red in this case
else
    s1 = sierpinski(a,M1,M3,n-1);
    s2 = sierpinski(M1,b,M2,n-1);
    s3 = sierpinski(M3,M2,c,n-1);
    out = [s1 s2 s3];
end

如果您希望自己运行代码,这里是一个任意输入:sierpinski([0 0],[1 0],[。5 .8],2) 下面的第一张图是我得到的,第二张是我想要的(除了黑色背景)。 What I get

What i want

1 个答案:

答案 0 :(得分:1)

你的函数是一个递归函数,这意味着它将从内部代码再次调用自身,n>0

现在已经设置好了,让我们试着理解你的代码做了什么,并将它与你希望代码做的事情进行比较。

第1步:

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

此处,作为n=0,您不会评估递归调用。

您的代码的作用:

a)计算构成输入三角形的顶点中点的坐标

b)绘制与输入点对应的三角形

您希望代码执行的操作:

a)计算构成输入三角形的顶点中点的坐标

b)绘制与这些MIDDLES对应的三角形。

第2步:

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

您的代码的作用:

a)计算顶点的中间值

b)通过拾取2个中间和1个相应的输入点,通过3个外部三角形递归调用该函数。

c)没有情节

d)递归调用将红色修补3个外三角形。

您应该开始看到问题了。您唯一需要做的是:

1)将您的呼叫转移到if检查之外的补丁,以便每次都调用它。

2)将您传递的输入更改为patch,以便绘制输入三角形顶点的中间位置。

所以它有点像:

function out = sierpinski(a, b, c, n)
M1 = (a+b)/2;
M2 = (b+c)/2;
M3 = (a+c)/2;
k = [M1(1), M2(1), M3(1)];
m = [M1(2), M2(2), M3(2)];
patch(k,m,'r')  % choosing the color red in this case
if n==0
    out.x=[a(1), b(1), c(1)];
    out.y=[a(2), b(2), c(2)];
else
    s1 = sierpinski(a,M1,M3,n-1);
    s2 = sierpinski(M1,b,M2,n-1);
    s3 = sierpinski(M3,M2,c,n-1);
    out = [s1 s2 s3];
end
相关问题