Matlab 画渐隐方块。

3
我需要在MATLAB中创建一个类似于下面这个图形的脚本:

The shape I have to make

但我现在拥有的代码并不起作用,它给出的结果是相反的,即正方形的大小会增加而不是缩小。

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

请在回答时提供解释,因为我想知道我做错了什么。

1个回答

2

为了简化这个探究,让我们只看x的两个值。在第一次迭代后,x将是21;在第二次迭代中是10.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

请注意,我们用 edge_len 替换了 x(2) - x(1)。然后我们还有一个问题是设置颜色。您可以使用颜色向量 c = [1, k / 10, k / 10] 来创建从红色到几乎白色的渐变。然后,您将使用 fill(..., c); 而不是 fill(..., 'r'); 这样,循环外就不会有任何的 fill。这原来覆盖了您在问题中展示的代码块中所有有趣的图形。

我只看到一个带有小白边框的大红正方形...你知道为什么吗?我改变了x和y的初始化。 - heinst
已编辑以显示整个代码。也许您没有设置 hold on - s.bandara

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接