Рассчитайте точку на вашей линии, ближайшую к этой точке.
Предполагая, что отрезок прямой - это a и b, а точка - p.
float vAPx = p.x - a.x;
float vAPy = p.y - a.y;
float vABx = b.x - a.x;
float vABy = b.y - a.y;
float sqDistanceAB = a.distanceSq(b);
float ABAPproduct = vABx*vAPx + vABy*vAPy;
float amount = ABAPproduct / sqDistanceAB;
if (amount > 1) amount = 1;
if (amount < 0) amount = 0;
Что дает вам «количество», как далеко через отрезок линии вы находитесь между A и B (правильно ограничены).
float nx = (amount * (b.x - a.x)) + a.x;
float ny = (amount * (b.y - a.y)) + a.y;
Дает вам очко (nx, ny).
if (p.distance(nx,ny) > threshold) reject;
Это будет правильно работать после конца отрезка, так как «количество» будет находиться в диапазоне от 0 до 1.
Если вам не нужен ограниченный отрезок, избавьтесь от границ суммы. Остальная часть кода будет по-прежнему работать, вычисляя позиции за и до A и за B.
Был еще один вопрос, который утверждал, что этот вопрос был дубликатом, но он требует другого, поэтому мое решение решает положение точки, а затем просто решает евклидово расстояние (которое фактически решает оба вопроса).
a.distanceSq (b) также можно сделать как vABx vABx + vABy vABy, поскольку мы уже сделали это.