我希望创建填充的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) 下面的第一张图是我得到的,第二张是我想要的(除了黑色背景)。
答案 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