Самый простой способ обойти это - не думать о наклоне m, а об изменении x и y, которое я называю dx, dy (из обозначений исчисления).
Причина в том, что работа с уклоном для вертикальной линии бесконечна, и в любом случае вам не нужно использовать функции триггера, этот код будет быстрее и проще.
dx = x2 - x1;
dy = y2 - y1;
Я предполагаю, что точка 2 является пересечением желаемой линии.
Итак, перпендикулярная линия имеет наклон с отрицательной обратной величиной первой.
Есть два способа сделать это:
dx2 = -dy
dy2 = dx
или
dx2 = dy
dy2 = -dx
это соответствует двум направлениям: одно поворачивает направо, а другое налево.
Однако dx и dy масштабируются до длины исходного отрезка. Ваш перпендикуляр имеет другую длину.
Вот длина между двумя точками:
double length(double x1, double y1, double x2, double y2) {
return sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1));
}
Делай, что хочешь, чтобы перейти на ту или иную сторону:
double scale = length(whatever length you want to go)/sqrt(dx*dx+dy*dy);
double dx2 = -dy * scale;
double dy2 = dx * scale
и снова то же самое для другой стороны.
Я только что понял, что мой пример немного с ++, так как я использовал sqrt, но различия тривиальны. Обратите внимание, что вы можете написать код более эффективно, комбинируя квадратные корни.