我正在尝试根据取决于曲线值的函数填充两条曲线之间的区域。
这是我到目前为止所做的代码
i=50;
cc = @(xx,x,y) 1./(1+(exp(-xx)/(exp(-x)-exp(-y))));
n_vec = 2:0.1:10;
x_vec = linspace(2,10,length(n_vec));
y_vec = abs(sin(n_vec));
N=[n_vec,fliplr(n_vec)];
X=[x_vec,fliplr(y_vec)];
figure(1)
subplot(2,1,1)
hold on
plot(n_vec,x_vec,n_vec,y_vec)
hp = patch(N,X,'b')
plot([n_vec(i) n_vec(i)],[x_vec(i),y_vec(i)],'linewidth',5)
xlabel('n'); ylabel('x')
subplot(2,1,2)
xx = linspace(y_vec(i),x_vec(i),100);
plot(xx,cc(xx,y_vec(i),x_vec(i)))
xlabel('x'); ylabel('c(x)')
这段代码产生了下图
我添加的颜色代码表示两条曲线之间区域的每条线(沿 y 轴在 x 轴上的一个点)应该是的颜色编码。
总的来说,整个区域应该用渐变颜色填充,这取决于曲线的值。
我已经协助解决了以下问题,但无法解决问题
MATLAB fill area between lines
Patch circle by a color gradient
Filling between two curves, according to a colormap given by a function MATLAB
注意:曲线的函数形式并不重要,我更喜欢一个答案,它指的是构成曲线的两个通用数组。
最佳答案
冲浪图法
- 与散点图方法相同,即生成点网格。
y = [x_vec(:); y_vec(:)];
resolution = [500,500];
px = linspace(min(n_vec), max(n_vec), resolution(1));
py = linspace(min(y), max(y), resolution(2));
[px, py] = meshgrid(px, py);
- 生成一个逻辑数组,指示点是否在多边形内,但不需要提取点:
in = inpolygon(px, py, N, X);
- 生成 Z。Z 的值指示用于曲面图的颜色。因此,它是使用您的函数
cc
生成的。
pz = 1./(1+(exp(-py_)/(exp(-y_vec(i))-exp(-x_vec(i)))));
pz = repmat(pz',1,resolution(2));
- 将感兴趣区域外的点的 Z 值设置为
NaN
,这样 MATLAB 就不会绘制它们。
pz(~in) = nan;
- 生成有界颜色图(如果您想使用全色范围,请删除)
% generate colormap
c = jet(100);
[s,l] = bounds(pz,'all');
s = round(s*100);
l = round(l*100);
if s ~= 0
c(1:s,:) = [];
end
if l ~= 100
c(l:100,:) = [];
end
- 最后,情节。
figure;
colormap(jet)
surf(px,py,pz,'edgecolor','none');
view(2) % x-y view
随意转动图像,看看它在 Z 方向上的样子 - 漂亮 :)
要测试的完整代码:
i=50;
cc = @(xx,x,y) 1./(1+(exp(-xx)/(exp(-x)-exp(-y))));
n_vec = 2:0.1:10;
x_vec = linspace(2,10,length(n_vec));
y_vec = abs(sin(n_vec));
% generate grid
y = [x_vec(:); y_vec(:)];
resolution = [500,500];
px_ = linspace(min(n_vec), max(n_vec), resolution(1));
py_ = linspace(min(y), max(y), resolution(2));
[px, py] = meshgrid(px_, py_);
% extract points
in = inpolygon(px, py, N, X);
% generate z
pz = 1./(1+(exp(-py_)/(exp(-y_vec(i))-exp(-x_vec(i)))));
pz = repmat(pz',1,resolution(2));
pz(~in) = nan;
% generate colormap
c = jet(100);
[s,l] = bounds(pz,'all');
s = round(s*100);
l = round(l*100);
if s ~= 0
c(1:s,:) = [];
end
if l ~= 100
c(l:100,:) = [];
end
% plot
figure;
colormap(c)
surf(px,py,pz,'edgecolor','none');
view(2)
关于Matlab:两条曲线之间的补丁区域取决于曲线值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57782991/