3

我需要在 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

请提供解释和答案,因为我想了解我做错了什么。

4

1 回答 1

2

查看x单独的两个值以简化此调查。在您的第一次迭代之后,x将是2and 1,在第二次迭代中1and 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有了这个,循环之外就不会有任何东西了。这曾经涵盖了您在问题中显示的代码块中所有有趣的图形。

于 2013-01-30T03:03:18.463 回答