Данные для контурных линий могут быть извлечены из вызова на contour
.Первое возвращаемое значение - это матрица контуров , которую можно проанализировать, чтобы получить точки каждой каждой линии контура.Тогда это просто вопрос логистики, чтобы найти «максимальную» точку, которую вы действительно представляете как точку вдоль контура с наибольшим значением 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](https://i.stack.imgur.com/zGY40.png)
Как видите, точность линии не уступает точности самих линий контура.Вы можете повысить точность, сделав ваши данные более плотными и, следовательно, ваши контурные линии более гладкими.Выше с шагом 0.02
вместо 0.2
в вызове meshgrid
:
![result with nice and smooth resolution](https://i.stack.imgur.com/tiK6C.png)