Это векторизованная функция Matlab для нахождения парных проекций m
точек на n
отрезки линии. Здесь xp
и yp
являются m by 1
векторами, содержащими координаты m
различных точек, а x1
, y1
, x2
и y2
являются n by 1
векторами, содержащими координаты начальной и конечной точек n
различных отрезков.
Возвращает m by n
матрицы, x
и y
, где x(i, j)
и y(i, j)
являются координатами проекции i
-ой точки на j
-ую линию.
Фактическая работа выполняется в первые несколько строк, а остальная часть функции запускает демонстрацию самопроверки, на случай, если она вызывается без параметров. Это относительно быстро, мне удалось найти проекции 2k точек на отрезки линии 2k менее чем за 0,05 с.
function [x, y] = projectPointLine(xp, yp, x1, y1, x2, y2)
if nargin > 0
xd = (x2-x1)';
yd = (y2-y1)';
dAB = xd.*xd + yd.*yd;
u = bsxfun(@rdivide, bsxfun(@times, bsxfun(@minus, xp, x1'), xd) + ...
bsxfun(@times, bsxfun(@minus, yp, y1'), yd), dAB);
x = bsxfun(@plus, x1', bsxfun(@times, u, xd));
y = bsxfun(@plus, y1', bsxfun(@times, u, yd));
else
nLine = 3;
nPoint = 2;
xp = rand(nPoint, 1) * 2 -1;
yp = rand(nPoint, 1) * 2 -1;
x1 = rand(nLine, 1) * 2 -1;
y1 = rand(nLine, 1) * 2 -1;
x2 = rand(nLine, 1) * 2 -1;
y2 = rand(nLine, 1) * 2 -1;
tic;
[x, y] = projectPointLine(xp, yp, x1, y1, x2, y2);
toc
close all;
plot([x1'; x2'], [y1'; y2'], '.-', 'linewidth', 2, 'markersize', 20);
axis equal;
hold on
C = lines(nPoint + nLine);
for i=1:nPoint
scatter(x(i, :), y(i, :), 100, C(i+nLine, :), 'x', 'linewidth', 2);
scatter(xp(i), yp(i), 100, C(i+nLine, :), 'x', 'linewidth', 2);
end
for i=1:nLine
scatter(x(:, i)', y(:, i)', 100, C(i, :), 'o', 'linewidth', 2);
end
end
end