Получение промежуточных точек, сгенерированных plot () в MATLAB - PullRequest
4 голосов
/ 15 декабря 2010

У меня есть серия XY точек в MATLAB.Эти пары описывают точки вокруг фигуры на изображении;они не являются функцией, то есть две или более точек y могут существовать для каждого значения x.

Я могу построить эти точки индивидуально, используя что-то вроде

plot(B(:,1),B(:,2),'b+');

Я также могу использовать plotдля соединения точек:

plot(B(:,1),B(:,2),'r');

Я пытаюсь получить свои собственные значения точек, которые я могу использовать для соединения точек, чтобы использовать их для дальнейшего анализа.Мне не нужен полностью связанный граф, и мне нужно что-то на основе данных, а не только графика, которую выдает plot ().Я хотел бы, чтобы plot () генерировал эти точки (как это, кажется, происходит за кулисами), но я попытался использовать linseries, возвращаемый plot (), и он либо не работает, насколько я понимаю, либо простоне дает мне то, что я хочу.

Я бы подумал, что это проблема интерполяции, но точки не содержат функцию;они описывают форму.По сути, все, что мне нужно, это точки, которые plot (), кажется, вычисляет;прямые, соединяющие ряд точек.Кривая была бы бонусом и спасла бы меня вниз по течению.

Как я могу сделать это в MATLAB?

Спасибо!

Редактировать: Да, картинка поможет)

Синие точки - это действительные значения точек (x, y), построенные с использованием первого вызова plot () выше.Красный контур - результат вызова plot () с использованием второго подхода, описанного выше.Я пытаюсь получить данные о точке красного контура;другими словами, точки, соединяющие синие точки.alt text

Ответы [ 3 ]

6 голосов
/ 16 декабря 2010

У Адриена определенно правильная идея : определите параметрическую координату, а затем выполните линейную интерполяцию по координатам x и y отдельно.

Я хотел бы добавить еще один способ определить параметрическую координату, чтобы вы могли создавать равномерно расположенные точки интерполяции вокруг всей фигуры за один проход. Первое, что вы хотите сделать, если вы еще этого не сделали, это убедиться, что последняя координатная точка повторно соединяется с первой, реплицируя первую точку и добавляя ее в конец:

B = [B; B(1,:)];

Затем, вычислив общее расстояние между последующими точками, а затем взяв кумулятивную сумму, вы можете получить параметрическую координату, которая делает маленькие шаги для точек, расположенных близко друг к другу, и большие шаги для точек, расположенных далеко друг от друга:

distance = sqrt(sum(diff(B,1,1).^2,2));  %# Distance between subsequent points
s = [0; cumsum(distance)];               %# Parametric coordinate

Теперь вы можете интерполировать новый набор точек, равномерно распределенных по краю вдоль прямых, соединяющих ваши точки, с помощью функции INTERP1Q :

sNew = linspace(0,s(end),100).';   %'# 100 evenly spaced points from 0 to s(end)
xNew = interp1q(s,B(:,1),sNew);     %# Interpolate new x values
yNew = interp1q(s,B(:,2),sNew);     %# Interpolate new y values

Эти новые наборы точек не обязательно будут включать исходные точки, поэтому, если вы хотите убедиться, что исходные точки также появляются в новом наборе, вы можете сделать следующее:

[sAll,sortIndex] = sort([s; sNew]);  %# Sort all the parametric coordinates
xAll = [B(:,1); xNew];               %# Collect the x coordinates
xAll = xAll(sortIndex);              %# Sort the x coordinates
yAll = [B(:,2); yNew];               %# Collect the y coordinate
yAll = yAll(sortIndex);              %# Sort the y coordinates


Пример:

Вот пример, показывающий, как работает вышеуказанный код (я использую 11 пар координат x и y, одна из которых повторяется для полного примера):

B = [0.1371 0.1301; ...  %# Sample data
     0.0541 0.5687; ...
     0.0541 0.5687; ...  %# Repeated point
     0.0588 0.5863; ...
     0.3652 0.8670; ...
     0.3906 0.8640; ...
     0.4090 0.8640; ...
     0.8283 0.7939; ...
     0.7661 0.3874; ...
     0.4804 0.1418; ...
     0.4551 0.1418];
%# Run the above code...
plot(B(:,1),B(:,2),'b-*');  %# Plot the original points
hold on;                    %# Add to the plot
plot(xNew,yNew,'ro');       %# Plot xNew and yNew

alt text

2 голосов
/ 16 декабря 2010

Сначала я бы определил некоторую параметрическую координату вдоль различных сегментов (то есть между точками данных)

s = 1:size(B,1);

Затем просто используйте interp1 для интерполяции в s пространстве.Например, если вы хотите сгенерировать 10 значений на линии между точками данных 5 и 6:

s_interp = linspace(5,6,10); % parametric coordinate interpolation values
x_coord = interp1(s,B(:,1),s_interp,'linear');
y_coord = interp1(s,B(:,2),s_interp,'linear');

Это должно сработать.

A.

0 голосов
/ 15 марта 2017

На самом деле есть функция MATLAB «improfile», которая может помочь вам в вашей проблеме. Допустим, это 4 координаты, которые вы хотите найти между этими координатами.

xi=[15 30 20 10];
yi=[5 25 30 50];

figure;
plot(xi,yi,'r^-','MarkerSize',12)
grid on

enter image description here

Просто сгенерируйте случайное изображение и запустите функцию

n=50; % total number of points between initial coordinates
I=ones(max([xi(:);yi(:)]));
[cx,cy,c] = improfile(I,xi,yi,n);

hold on, plot(cx,cy,'bs-','MarkerSize',4)

enter image description here

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...