Дано:
- (X, Y), которая является позицией транспортного средства.
- Массив (X, Y), которые являются вершинами в полилинии. Обратите внимание, что полилиния состоит только из прямых сегментов, без дуг.
Что я хочу:
- Чтобы вычислить, находится ли транспортное средство слева или справа от полилинии (или сверху, конечно).
Мой подход:
- Итерация по всем сегментам линии и вычисление расстояния до каждого сегмента. Затем для ближайшего сегмента вы делаете простой левый тест (как описано здесь).
Возможные проблемы:
- Когда три точки образуют угол меньше 90 градусов (например, при ударе изображения), возникает более сложный сценарий. Когда транспортное средство находится в красном сегменте, как показано ниже, ближайший сегмент может быть либо одним из двух. Однако левая часть теста даст право, если первый сегмент выбран в качестве ближайшего сегмента и оставлен в противном случае. Мы можем легко увидеть (по крайней мере, надеюсь), что правильный результат должен состоять в том, что транспортное средство осталось от полилинии.
Мой вопрос:
- Как я могу элегантно, но в основном эффективно заботиться об этой конкретной ситуации?
Мое исправление:
- Вычислить для обоих сегментов точку на этом сегменте, начиная с вершины.
- Вычислить расстояние от транспортного средства до обеих точек, используя эвклидову расстояние
- Сохраняйте сегмент, для которого вычисленная точка является ближайшей.
Я не очень доволен этим исправлением, потому что чувствую, что мне не хватает более элегантного решения, мое исправление кажется довольно "взломанным". Эффективность является ключевым фактором, поскольку она используется в встроенной системе реального времени.
Существующая база кода находится на С++, поэтому, если вы хотите писать на определенном языке, предпочтение отдается С++. Спасибо!
[править] Я изменил мое исправление, от перпендикулярной точки до параллельной точки, так как я считаю, что легче следовать за сегментом линии, чем вычислять внешнюю нормаль.