0

プロットする関数 y=x^2 があり、この曲線で囲まれた領域を y 方向に沿って黒から赤へのグラデーション色で塗りつぶしたいと思います。色はネットで見つけた

x = linspace(-3, 3, 20)';
f = x.^2;
M = f.^2;

N = length(x);
verts = [x(:), f(:)-max(f); x(:) zeros(N,1)];

q = (1:N-1)';
faces = [q, q+1, q+N+1, q+N];
p = patch('Faces', faces, 'Vertices', verts, 'FaceVertexCData', [M(:); M(:)], 'FaceColor', 'interp', 'EdgeColor', 'none')

このコードは、次のように、曲線でx軸にバインドされた領域を表示します

ここに画像の説明を入力

でも埋めたいのはWHITEエリア。だから私は次のようにコードを変更します

x = linspace(-3, 3, 20)';
f = x.^2;
M = f.^2;

N = length(x);
verts = [x(:), f(:)-max(f); x(:) zeros(N,1)];

q = (1:N-1)';
faces = [q, q+1, q+N+1, q+N];
p = patch('Faces', faces, 'Vertices', verts, 'FaceVertexCData', [M(:); M(:)], 'FaceColor', 'interp', 'EdgeColor', 'none')

これは私に次のようなものを与えます ここに画像の説明を入力

正しい領域を埋めますが、2 つの問題があります。

  1. 画像全体が 9 単位だけ負の y 軸にシフト
  2. グラデーションの色は左から右に塗りつぶされましたが、下から上 (垂直) に塗りつぶしたい
  3. カラーマップは黒から赤に定義されていませんでした (ただし、手動で変更できます)。
4

2 に答える 2

1

線のせいで縦ずれが起きた

verts = [x(:), f(:)-max(f); x(:) zeros(N,1)];

wheref(:) - max(f)は常に <=0 です。f(:)その問題を解決するために使用する必要があると思います。

シェーディングの方向については、パッチを垂直のストリップとして定義しているため、パッチは垂直のストリップとして色付けされます。水平シェーディングが必要な場合は、水平パッチを定義する必要があります。あなたはそれを理解できますか、それとも助けが必要ですか?

編集 - このコードは、あなたが求めていることを行います:

figure;
x=linspace(-3, 3, 200);
f = x.^2;
plot(x, f, 'r'); hold on % you could leave this line out... then there is no curve
N = numel(x);
for ii = ceil(N/2):N-1
    ix = [ii ii+1 N-ii N-ii+1];
    disp(ix)
    patch(x(ix), f(ix), f(ii)*256/max(f(:)),'edgecolor', 'none');
end

出力は次のとおりです。 シェーディングの例

もう 1 つの問題 - 色 M を f.^2 として定義しています - 2 乗のラウンドが多すぎませんか? x.^2 (または単に F) のつもりだったと思いますか?

于 2013-02-18T03:54:23.093 に答える
0

ほぼ同じことを達成するためのおそらくはるかに簡単な方法があります...次のように絵を描きます:

cplot = repmat(1:256, [256 1])';    % create a 256 square horizontal gradient
xv = linspace(-3, 3, 256);          % range of x values
yv = linspace(0, 9, 256);           % range of y values
cplot(repmat(xv.^2, [256 1])>repmat(yv', [1 256]))=255; % set area below the curve to white
figure
imagesc(xv, yv, cplot);

255あとは、カラースケールを修正するだけです...色を白にしたいでしょう...

于 2013-02-18T04:05:11.930 に答える