Я успешно выполнил предложение Blazemonger выше, и оно работает для меня.
Вот его новое предложение:
Другой подход, который мне кажется более простым: если новая точка (а)
НЕ внутри существующего многоугольника и (б) создает
внутренний угол больше 180 градусов, тогда он должен быть недействительным.
Есть много существующих алгоритмов для проверки, находится ли точка в
внутренняя часть многоугольника (stackoverflow.com/q/471962/901048) и
измерение внутреннего угла является вопросом нахождения разницы
между арктангенсами каждого склона
Чтобы определить, находится ли точка в многоугольнике, я использовал многоугольник. Содержит функцию из обновленного epoly.js Майка Уильямса, найденного здесь: http://www.geocodezip.com/scripts/v3_epoly.js.
Если точка не находится в многоугольнике (см. Выше), мы:
1.) Определите, превышает ли внутренний угол последних двух векторов 180 градусов. Для этого нам нужно реализовать приведенное ниже уравнение, чтобы найти угол двух последних векторов многоугольника:
angleRadians = Math.acos ((vx1 * vx2 + vy1 * vy2) / (Math.sqrt (vx1 * vx1 + vy1 * vy1) * Math.sqrt (vx2 * vx2 + vy2 * vy2)));
это использование произведения точек векторов.
Но это не учитывает «направление намотки», сначала вы должны получить перекрестное произведение, и, если перекрестное произведение положительное, это был левый поворот, если отрицательным - правый поворот.
Я включил здесь свой JS-код в качестве сущности: https://gist.github.com/3741816.
Кстати, я новичок здесь, в StackOverflow - это был такой большой ресурс для меня, спасибо всем, кто внес свой вклад!