Я могу придумать 2 метода из моей головы.
Лично я бы сделал это, используя аффинные преобразования (но, похоже, у вас нет этой концепции, поскольку вы используете векторы, а не точки). Процедура с аффинными преобразованиями проста. Поверните точки к одной из основных осей, прочитайте координату вашей точки, обнулите другое значение и выполните обратное преобразование. Причина этой стратегии в том, что почти все процедуры преобразования сводятся к очень простым, понятным для человека операциям со схемой аффинного преобразования. Так что никакой реальной работы не нужно делать, когда у вас есть инструменты и структуры данных под рукой.
Однако, поскольку вы этого не предвидели, я предполагаю, что вместо этого вы хотите услышать векторную операцию (потому что вы либо предпочитаете матричную операцию, либо убегаете, когда ее предлагают, это одно и то же). Итак, у вас следующая ситуация:
Это выражается в виде системы уравнений (она намеренно показывает вам, что на данный момент это НЕ код, а математика):
line.start.x + x*(line.end.x - line.start.x)+ y*direction.x = point.x
line.start.y + x*(line.end.y - line.start.y)+ y*direction.y = point.y
теперь это можно решить для x (и y)
x = (direction.y * line.start.x - direction.x * line.start.y -
direction.y * point.x + direction.x * point.y) /
(direction.y * line.end.x - direction.x * line.end.y -
direction.y * line.start.x + direction.x * line.start.y);
// the solution for y can be omitted you dont need it
y = -(line.end.y * line.start.x - line.end.x * line.start.y -
line.end.y * point.x + line.start.y * point.x + line.end.x * point.y -
line.start.x point.y)/
(-direction.y * line.end.x + direction.x * line.end.y +
direction.y * line.start.x - direction.x * line.start.y)
Расчет сделан с помощью mathematica, если я не скопировал ничего неправильно, он должен работать. Но я бы никогда не использовал это решение, потому что оно непонятно (хотя это математика в средней школе или, по крайней мере, там, где я нахожусь). Но используйте преобразование пространства, как описано выше.
10.12.2013