2015-12-08 56 views
2

我希望创建填充的谢尔宾斯基三角形。相反,我的代码会生成一个填充背景的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 

如果你自己想运行的代码,这里是一个任意的输入:谢尔宾斯基([0],[1:0],[0.5 0.8],2) 第一张照片下面是我得到的,其次是我想要的(除了黑色背景)。 What I get

What i want

+0

你可以添加你当前ouptut的图像与预期输出,以便它的更清楚一点? – BillBokeey

+0

@BillBokeey是的,检查编辑。 – Lozansky

回答

1

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

既然已经设置好了,那就让我们试着了解一下你的代码的作用,并且将它与你想要的代码进行比较。

第1步:

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

这里,n=0,你会不会评估递归调用。

你的代码做:

a)计算构成对应于输入的输入三角形

B)画出的三角形顶点的中部的坐标点

什么你想要你的代码去做:

a)计算顶点中间点坐标constitut输入三角形

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

第2步:

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

你的代码做:

a)计算顶点

B的中段)递归调用函数与3通过拾取2个中间点和1个相应的输入点形成外三角形。

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

我试过 '如果n> = 0 out.x = k; out.y = m; out.y = m; patch(out.x,out.y,'r') pause(0.1)' 但是,它只为最大的n打补丁。我如何为所有n打补丁而不用? – Lozansky

+0

明天我将编辑我的答案,您必须了解递归调用的工作原理 – BillBokeey

+0

谢谢,现在它按预期工作。但为什么在步骤1中n = 0?它不应该从n = n开始,并且在n = 0时结束吗? – Lozansky

相关问题