Страница 1 из 1

Положение точки отностительно линии

Добавлено: 13 сен 2016, 15:12
Филиппов Владислав
Доброго здравия!
Кто может подсказать, в чём проблема моего кода?
Я хочу определить положение точки относительно линии.
Руководствовался этим, метод Point::classify
Сам я сделал его на JavaScript:

Код: Выделить всё

function testPos() {
  var line = [[51.503844,-0.266659],[51.504226,-0.266873]];
  var points = [{c:[51.503874,-0.266653], l:'327'}, {c:[51.504139,-0.266791], l:'339'}, {c:[51.504190,-0.266882], l:'328'}, {c:[51.503852,-0.266718], l:'324'}];

  for (var i = 0; i < points.length; i++) {
    var pt = points[i];
    console.log(pt.l);
    var p0 = line[0];
    var p1 = line[1];
    var a = {
      x: p1[0] - p0[0],
      y: p1[1] - p0[1]
    };
    var b = {
      x: pt.c[0] - p0[0],
      y: pt.c[1] - p0[1]
    };
    var func = a.x * b.y - b.x * a.y;
    if (func > 0) {
      if (((a.x * b.x) < 0) || ((a.y * b.y) < 0)) {
        console.log('Point behind and left');

      } else if ((Math.sqrt(a.x * a.x + a.y * a.y)) < (Math.sqrt(b.x * b.x + b.y * b.y))) {
        console.log('Point beyond and left');

      } else {
        console.log('Point left');

      }
    } else if (func < 0) {
      if (((a.x * b.x) < 0) || ((a.y * b.y) < 0)) {
        console.log('Point behind and right');

      } else if ((Math.sqrt(a.x * a.x + a.y * a.y)) < (Math.sqrt(b.x * b.x + b.y * b.y))) {
        console.log('Point beyond and right');

      } else {
        console.log('Point right');
        
      }
    } else {
      console.log('other');
    }
  }
}
Проблема с определением расположения первой точки из массива {c:[51.503874,-0.266653], l:'327'} - она определяется как "Point behind and left" хотя известно, что она исключительно слева и на выходит за линию.

Re: Положение точки отностительно линии

Добавлено: 13 сен 2016, 17:42
Игорь Белов
Условие

Код: Выделить всё

if (((a.x * b.x) < 0) || ((a.y * b.y) < 0)) { }
неверно. Точка сзади, если a.x * b.x + a.y * b.y < 0.

Условие

Код: Выделить всё

if ((Math.sqrt(a.x * a.x + a.y * a.y)) < (Math.sqrt(b.x * b.x + b.y * b.y))) { }
неверно. Точка впереди, если a.x * b.x + a.y * b.y > a.x * a.x + a.y * a.y.

Re: Положение точки отностительно линии

Добавлено: 13 сен 2016, 18:08
trir
хотя известно, что она исключительно слева и на выходит за линию
кому известно?

Re: Положение точки отностительно линии

Добавлено: 14 сен 2016, 04:50
Филиппов Владислав
Игорь, огромное спасибо! Всё получилось. А что вы скажите по поводу той ссылки, что я указал в качестве своего руководства, что с теми формулами?

trir, просто направление осей немного не то у вас. X на север.
Безымянный.png
Безымянный.png (5.25 КБ) 5536 просмотров
У меня MapEdit и "польский формат"

Re: Положение точки отностительно линии

Добавлено: 14 сен 2016, 04:57
trir
А что вы скажите по поводу той ссылки, что я указал в качестве своего руководства, что с теми формулами?
всё там правильно
просто направление осей немного не то у вас. X на север
это не важно, положение определяется относительно линии

Re: Положение точки отностительно линии

Добавлено: 14 сен 2016, 05:08
Denis Rykov
В JSTS (порт JTS, он же GEOS) формулы похожи на те, что привёл Владислав. Может там просто речь не о положении точки относительно отрезка, а наоборот?

Re: Положение точки отностительно линии

Добавлено: 14 сен 2016, 07:29
Игорь Белов
Филиппов Владислав писал(а):А что вы скажите по поводу той ссылки, что я указал в качестве своего руководства, что с теми формулами?
Denis Rykov писал(а):В JSTS (порт JTS, он же GEOS) формулы похожи на те, что привёл Владислав. Может там просто речь не о положении точки относительно отрезка, а наоборот?
По обеим ссылкам другой алгоритм: если точка не лежит на линии, функция возвращает LEFT или RIGHT; остальные проверки, в т. ч. на BEHIND и BEYOND, относятся к точке, лежащей на линии, поэтому работают в таком виде.