连接轮廓线的极点

时间:2018-10-17 18:39:00

标签: matlab max contour

我正在尝试在Matlab的轮廓图中标记并连接最大点。

如果我举一个简单的例子:

x = -2:0.2:2;
y = -2:0.2:3;
[X,Y] = meshgrid(x,y);
Z = X.*exp(-X.^2-Y.^2);
contour(X,Y,Z,'ShowText','on')

它给出了下面的轮廓曲线,黑线和红圈是我想要绘制的。

contour plot with max points

我尝试搜索Z中每一行的最大值索引,然后绘制相应的X和Y值。 这并没有为我最初的问题提供正确的值。

我要寻找的是是否有一种方法可以自动从图形/数据中提取这些值。

1 个答案:

答案 0 :(得分:2)

可以从对contour的调用中提取轮廓线的数据。返回的第一个值是contour matrix,可以对其进行解析以为您提供每条轮廓线的点。然后,找到“最大”点只是后勤问题,您似乎真的是想沿着轮廓上具有最大y值的点:

x = -2:0.2:2;
y = -2:0.2:3;
[X,Y] = meshgrid(x,y);
Z = X.*exp(-X.^2-Y.^2);
M = contour(X,Y,Z,'ShowText','on');

inow = 1;
maxpoints = [];
while inow < size(M,2)
   % column at inow contains level value and number of points in contour line
   level = M(1,inow);
   nvals = M(2,inow);
   % extract coordinates of the corresponding contour line
   xvals = M(1,inow+1:inow+nvals);
   yvals = M(2,inow+1:inow+nvals);

   % find max y value along the contour
   [ymax, ind] = max(yvals);
   xmax = xvals(ind);
   maxpoints(end+1,:) = [xmax, ymax];

   % increment index
   inow = inow + nvals + 1;
end

% filter points as necessary
inds = maxpoints(:,1) > 0; % contours to the right
keeppoints = maxpoints(inds,:);

% plot them
hold on;
plot(keeppoints(:,1),keeppoints(:,2),'o-');

我们构建的maxpoints数组的大小为[ncontours, 2],并包含“最大”点的坐标。如果您只想使用一些可见轮廓,则需要过滤它们。结果如下:

resulting figure with "maximum" line plotted

如您所见,线条的精度仅与轮廓线本身的精度一样好。您可以通过使数据更密集从而使轮廓线更平滑来提高准确性。上面带有0.02步骤,而不是0.2调用中的meshgrid

result with nice and smooth resolution