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この調査を簡素化するために、単独の2つの値を見てください。最初の反復の後、はと、2番目の反復ではとになりxます。これは、意図したものとは逆に、正方形がどんどん小さくなってゼロに近づいていることを意味します。2110.5

原点の近くから始めて、遠くに行くにつれて縮んでいくのはどうですか?あなたは初期化することができx = [0, 2];ますy = [0, 2];。ここでは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 に答える