Если вы не работаете с графиком "1.5d" y=y(x)
, вы никогда не должны использовать формулы, основанные на y=m*x+q
, потому что это не работает для вертикальных линий (и плохо работает для почти вертикальных линий).
В вашем случае наилучшим подходом является использование параметрического уравнения для линии
x = x1 + t * dx
y = y1 + t * dy
, где dx = x2 - x1
и dy = y2 - y1
пропорциональны компонентам вектора единицы направления, ориентированного от P1 к P2и используются вместо m
и q
для определения линии (избегая любых проблем с вертикальными или почти вертикальными линиями).
Если вам нужна точка на определенном расстоянии, вам просто нужно найтифактические компоненты вектора единицы с
double dx = x2 - x1;
double dy = y2 - y1;
double dist = sqrt(dx*dx + dy*dy);
dx /= dist;
dy /= dist;
, а затем координаты нужной вам точки равны
double x3 = x1 + prescribed_distance * dx;
double y3 = y1 + prescribed_distance * dy;
или вместо этого используется -prescribed_distance
в зависимости от того, с какой стороны вы хотите точку: в направлении P2или от него?
Если, однако, предписанное расстояние пропорционально текущему расстоянию между двумя точками, нормализация не требуется, и результат можете проще:
double x3 = x1 + (x2 - x1) * k;
double y3 = y1 + (y2 - y1) * k;
, где k
- это соотношение между предписанным расстоянием и расстоянием между двумя точками (опять же с положительным или отрицательным знаком в зависимости от того, какая сторона вас интересует).
Используя параметрические уравнения x=x(t), y=y(t)
вместо явных уравнений y=y(x)
в дополнение к отсутствию искусственных проблем сингулярности, которые зависят от системы координат, вы также получаете формулы, тривиальные для расширения в более высоких измерениях.Например, для 3D-линии вам просто нужно добавить z
координату к вышеприведенным формулам таким же образом, как используются x
и y
...