У меня есть сегменты и точки, хранящиеся в db. Как бы я запросил db, чтобы получить все точки, которые находятся на определенном расстоянии от нескольких сегментов линии. Цель состоит в том, что когда пользователь нажимает на путь (дорога), все объекты, находящиеся на расстоянии от пути, должны быть выделены.
Спасибо.
Обновление: Пример … У меня есть путь, который идет от (0,0) до (0, 10). Программа должна найти и выделить все объекты в пределах x расстояния этого пути. Предположим, что x-расстояние равно «2» … тогда программа должна выделить все объекты в прямоугольнике (0,2) (10, -2). В принципе, это то же самое, что найти все объекты с близостью к линии (а не только одну точку).
Легко, когда линия горизонтальна … Но я не знаю, как решить для всех случаев, в том числе тогда линия может быть наклоном.
Обновление: точки хранятся в большой базе данных, поэтому я не могу проверить каждый из них для близости. Я пытаюсь найти способ получить только те, которые достаточно близки, если слишком много перекрывают запросы … После их получения я могу уточнить поиск, используя метод, описанный в «расстоянии между точкой и отрезком ». (Я думаю!) Спасибо!
Это даст вам расстояние от точки p до сегмента линии v, w. (на основе этого вопроса: кратчайшее расстояние между точкой и отрезком линии ). Вам нужно будет пробежать все свои очки и рассчитать расстояние до всех ваших сегментов, чтобы найти те, которые достаточно близко к маршруту.
Если это слишком медленно, вам нужно сделать какое-то упрощение, которое не требует квадратных корней.
function distanceToLineSegment(p, v, w) { var len2 = dist2(v, w); if (len2 == 0) return Math.sqrt(dist2(p, v)); var s = ((px - vx) * (wx - vx) + (py - vy) * (wy - vy)) / len2; if (s < 0) return Math.sqrt(dist2(p, v)); if (s > 1) return Math.sqrt(dist2(p, w)); var i = {x: vx + s * (wx - vx), y: vy + s * (wy - vy)}; return Math.sqrt(dist2(p, i)); function dist2(p, q) { return Math.pow(px - qx, 2) + Math.pow(py - qy, 2); } } alert(distanceToLineSegment({x:2, y:3}, {x:-1, y:4}, {x:3, y:8}));