我需要在MATLAB中创建一个与此类似的脚本:
但是我所拥有的代码不起作用,它给了我相反的,因为,正方形的大小增加而不是缩小。
x = [0 0 2 2];
y = [0 2 2 0];
fill(x,y,'r');
hold on
for i = 1:10
x = [(x(3)) (x(3)) (x(3)/2) (x(3)/2)];
y = [(y(3)) (y(2)/2) (y(2)/2) (y(3))];
fill(x,y,'r');
end
请提供解释和答案,因为我想了解我做错了什么。
答案 0 :(得分:2)
单独查看x
的两个值以简化此调查。在第一次迭代后,x
将是2
和1
,在第二次迭代1
和0.5
中。这意味着你正在接近零,正方形变得越来越小,与你想要做的相反。
你如何开始接近原点并随着你走得更远而缩小?您可以初始化x = [0, 2];
和y = [0, 2];
。我们这里只使用了两个元素,因为对于与轴对齐的正方形,这就是我们所需要的。第一次迭代可以从前一个正方形的边长度开始移位,如x = x + x(2) - x(1);
中所示。方块也必须缩小,所以你可以将左角移动一小部分边长,例如x(1) = x(1) + (x(2) - x(1)) * 0.1;
。总而言之,你的循环看起来像
close all, clear all;
x = [0, 2];
y = [0, 2];
hold on;
for k = 0 : 9
edge_len = x(2) - x(1);
x = x + edge_len; % shift
x(1) = x(1) + 0.2 * edge_len; % slightly shift right to shrink
y = y + edge_len;
y(1) = y(1) + 0.2 * edge_len;
fill([x(1), x(1), x(2), x(2)], [y(1), y(2), y(2), y(1)], 'r');
end
请注意,我们已将x(2) - x(1)
替换为edge_len
。然后我们设置你的颜色的另一个问题。您可以使用颜色矢量c = [1, k / 10, k / 10]
来创建从红色到近乎白色的渐变。然后,您使用fill(..., 'r');
fill(..., c);
这样,循环外不会有fill
。这通常用于覆盖您在问题中显示的代码块中所有有趣的图形。