Это зависит от того, сколько единичных векторов вы хотите проверить по одной фигуре. Если у вас есть одна форма и много тестов, проще всего, вероятно, преобразовать координаты вашей формы в полярные координаты, которые уже неявно представляют ваше решение. Однако это может быть не очень эффективным решением, если у вас разные фигуры и только несколько тестов для каждой фигуры.
Обновление на основе отредактированного вопроса:
Если лучи могут начинаться от произвольных точек, а не только от источника, вы должны проверить все точки. Это можно легко сделать, преобразовав границу вашей формы так, чтобы ваш луч для проверки начинался в начале координат в любом направлении координат (положительный x в моем примере кода)
% vector of shape boundary points (assumed to be image coordinates, i.e. integers)
shapeBoundary = [xs, ys];
% define the start point and direction you want to test
startPoint = [xsp, ysp];
testVector = unit([xv, yv]);
% now transform the shape boundary
shapeBoundaryTrans(:,1) = shapeBoundary(:,1)-startPoint(1);
shapeBoundaryTrans(:,2) = shapeBoundary(:,2)-startPoint(2);
rotMatrix = [testVector(2), testVector(1); ...
testVector(-1), testVector(2)];
% somewhat strange transformation to keep it vectorized
shapeBoundaryTrans = shapeBoundaryTrans * rotMatrix';
% now the test is easy: find the points close to the positive x-axis
selector = (abs(shapeBoundaryTrans(:,2)) < 0.5) & (shapeBoundaryTrans(:,1) > 0);
shapeBoundaryTrans(:,2) = 1:size(shapeBoundaryTrans, 1)';
shapeBoundaryReduced = shapeBoundaryTrans(selector, :);
if (isempty(shapeBoundaryReduced))
[dummy, idx] = min(shapeBoundaryReduced(:, 1));
collIdx = shapeBoundaryReduced(idx, 2);
% you have a collision with point collIdx of your shapeBoundary
else
% no collision
end
Возможно, это можно сделать более приятным способом, но вы поняли ...