Векторы слияния в Matlab

В Matlab у меня есть две матрицы, L1 и L2, содержащие в каждой строке координаты (строка, столбец) нескольких точек в 2D-пространстве:

L1=[1,1;2,2;3,3];
L2=[4,4;5,5;6,5;7,6;8,7];

После построения у меня есть это:

Красная линия — L1, а синяя — L2

Я пытаюсь реализовать алгоритм, который мог бы объединять линии, одинаково ориентированные. Я пробовал довольно долго. Я предполагаю, что самый простой способ решить эту проблему - выполнить следующие шаги:

- Во-первых: предположим, что L1 и L2 являются двумя отрезками одной и той же прямой (L3).

-Далее: начиная с (1,1) (или (8,7)) оценить ориентацию следующей точки. Другими словами, ориентация точки (2,2) относительно (1,1), точки (3,3,) относительно (2,2) и т. д. И сохраните эти значения.

-Далее: Рассчитать среднее значение из всех значений ориентации.

-Далее: оцените, имеют ли точки сплавления между волокнами, в данном случае (3,3) и (4,4), одинаковую ориентацию.

-Результаты: если предыдущая стадия ИСТИНА, то сплавить волокна. Если FALSE, ничего не делать.

Одним из ключевых моментов здесь является установление точки отсчета, от которой можно измерить углы ориентации. Возможно, этот подход слишком сложен. Я думаю, есть более простой способ и менее затратный по памяти способ. Спасибо.


person karl71    schedule 02.03.2014    source источник


Ответы (1)


Код -

% We need to set a tolerance value for the similarity of slopes between the
% main data and the "fusion" data. This tolerance is in degrees, so basically
% means that the fiber must be within TOL degrees left or right of the overall data average.
TOL = 10;

% Slightly different and a more general data probably
L1=[2,3;3,5;4,10];
L2=[7,15;8,19;9,21];
L_fiber = [L1(end,:);L2(1,:)];

% Slopes calculation
a1 = diff(L1);
m1 = a1(:,2)./a1(:,1);

a2 = diff(L2);
m2 = a2(:,2)./a2(:,1);

% Overall slope for the main data
m = mean([m1;m2]);

a_fiber = diff(L_fiber);
m_fiber = a_fiber(:,2)./a_fiber(:,1);
m_fiber_mean = mean(m_fiber);

% Checking if the fiber mean is within the limits set by TOL
deg_max = atan(m)*(180/pi) + TOL;
deg_min = atan(m)*(180/pi) - TOL;

slope_max = tan(deg_max*pi/180);
slope_min = tan(deg_min*pi/180);

if m_fiber_mean >= slope_min && m_fiber_mean <= slope_max
    out = true;
    disp('Yes the fusion matches the overall data');
else
    out = false;
    disp('No the fusion does not match the overall data');
end

Надеюсь, это уладится!

person Divakar    schedule 02.03.2014
comment
Вау! Действительно впечатляет! Я думал, как использовать наклоны линий, но не знал, как это сделать. Спасибо за такой быстрый ответ. Теперь я пробую ваш код с более сложными строками, посмотрим, как он работает... - person karl71; 02.03.2014
comment
Отредактировано для лучшего использования допуска сходства. - person Divakar; 02.03.2014
comment
Итак, TOL теперь являются градусами? - person karl71; 02.03.2014
comment
Да, как указано в коде. Извините за изменения, они были необходимы для более простого понимания кода и использования. - person Divakar; 02.03.2014
comment
ой! да, я не читал. Спасибо! Я был очень расстроен этим. - person karl71; 02.03.2014
comment
Divakar, я думаю должно быть дополнительное ограничение при добавлении/вычитании значения TOL. Например, представьте, что углы deg_max и deg_min больше -90 градусов. Если значение TOL достаточно велико, чтобы повернуть, например, на deg_min ниже -90 градусов, то при вычислении наклона_min у меня будет значение, сильно отличающееся от того, которое у меня есть, когда deg_min всего лишь на градус выше -90. Другими словами, если превышен предел в 90º, то при вызове функции tan (из-за разрывности этой функции) два одинаково ориентированных волокна не соединяются. Как я могу это решить? Спасибо - person karl71; 03.03.2014
comment
Я предполагаю, что, добавив (каким-то образом) значение допуска после вычисления загара, можно решить эту проблему. - person karl71; 03.03.2014