Поскольку в моем предыдущем ответе говорилось, как определить, была ли точка на линии, и реальный вопрос выглядит так: "Как я могу определить, находится ли точка рядом с линией сегмент", я добавляю новый ответ.
Вот хитрость: сначала найдите расстояние от вашего препятствия до каждой из двух конечных точек вашего отрезка.Эти два расстояния не однозначно определяют местоположение препятствия, но они однозначно определяют треугольник с тремя конкретными длинами сторон, и тогда мы можем сразу использовать связку геометрии.
![Triangle with sides A, B, C](https://i.stack.imgur.com/krRI2.png)
Я немного поиграл с цветами.Во всяком случае, я упомянул в комментарии выше, что вы должны использовать формулу расстояние до линии , чтобы найти расстояние между препятствием и линией.Но на самом деле это не сработает.Причина в том, что это точка - линия расстояние.Таким образом, для обоих приведенных ниже примеров формула вычислит жирное расстояние H на рисунке.
![Acute and Obtuse Triangle Diagrams](https://i.stack.imgur.com/TzVzh.png)
Это не правильно !!
Итак, вместо этого вот псевдокод для определения расстояния от вашего препятствия до отрезка, сформированного лазером:
Find the distance from my point to the line segment!
if the angle at (x,y) is obtuse
return A
else if the angle at (endx,endy) is obtuse
return B
else
return H
Вот математика, которую вы можете использовать для реализации вышеуказанного псевдокода:
- Чтобы увидеть, является ли угол в
(x,y)
тупым, найдите B^2 > A^2 + C^2
.Если это так, угол тупой. - Чтобы увидеть, является ли угол в
(endx, endy)
тупым, найдите ли A^2 > B^2 + C^2
.Если это так, то угол тупой. - Чтобы вычислить
H
, используйте два разных метода для определения площади треугольника - обычный base*height/2
и Формула Герона .
Это означает, что вы должны:
set s = (A+B+C)/2
The area of the triangle is C*H/2
The area of the triangle is also sqrt(s*(s-A)*(s-B)*(s-C))
So H = 2/C * sqrt(s*(s-A)*(s-B)*(s-C)).
Конечный результат будет выглядеть примерно так:
if B^2 > A^2 + C^2
return A
else if A^2 > B^2 + C^2
return B
else
s = (A+B+C)/2
return 2/C * sqrt(s*(s-A)*(s-B)*(s-C))
Я думаю, что этого должно быть достаточно для достижения того, что вына самом деле намереваемся сделать.Удачи и не сдавайся!