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

Вопросы общего характера по ГИС и дистанционному зондированию, не связанные с конкретным ПО.
Ответить
Аватара пользователя
Филиппов Владислав
Гуру
Сообщения: 1035
Зарегистрирован: 17 фев 2006, 06:28
Репутация: 144
Ваше звание: Геннадич
Откуда: Новосибирск
Контактная информация:

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

Сообщение Филиппов Владислав » 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" хотя известно, что она исключительно слева и на выходит за линию.

Аватара пользователя
Игорь Белов
Гуру
Сообщения: 2231
Зарегистрирован: 04 янв 2011, 22:00
Репутация: 1504
Откуда: Казань

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.
The purpose of computing is insight, not numbers

trir
Гуру
Сообщения: 5292
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1015
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

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

Сообщение trir » 13 сен 2016, 18:08

хотя известно, что она исключительно слева и на выходит за линию
кому известно?
Вложения
left_point.PNG
left_point.PNG (22.04 КБ) 5131 просмотр

Аватара пользователя
Филиппов Владислав
Гуру
Сообщения: 1035
Зарегистрирован: 17 фев 2006, 06:28
Репутация: 144
Ваше звание: Геннадич
Откуда: Новосибирск
Контактная информация:

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

Сообщение Филиппов Владислав » 14 сен 2016, 04:50

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

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

trir
Гуру
Сообщения: 5292
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1015
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

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

Сообщение trir » 14 сен 2016, 04:57

А что вы скажите по поводу той ссылки, что я указал в качестве своего руководства, что с теми формулами?
всё там правильно
просто направление осей немного не то у вас. X на север
это не важно, положение определяется относительно линии

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

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

Сообщение Denis Rykov » 14 сен 2016, 05:08

В JSTS (порт JTS, он же GEOS) формулы похожи на те, что привёл Владислав. Может там просто речь не о положении точки относительно отрезка, а наоборот?
Spatial is now, more than ever, just another column- The Geometry Column.

Аватара пользователя
Игорь Белов
Гуру
Сообщения: 2231
Зарегистрирован: 04 янв 2011, 22:00
Репутация: 1504
Откуда: Казань

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

Сообщение Игорь Белов » 14 сен 2016, 07:29

Филиппов Владислав писал(а):А что вы скажите по поводу той ссылки, что я указал в качестве своего руководства, что с теми формулами?
Denis Rykov писал(а):В JSTS (порт JTS, он же GEOS) формулы похожи на те, что привёл Владислав. Может там просто речь не о положении точки относительно отрезка, а наоборот?
По обеим ссылкам другой алгоритм: если точка не лежит на линии, функция возвращает LEFT или RIGHT; остальные проверки, в т. ч. на BEHIND и BEYOND, относятся к точке, лежащей на линии, поэтому работают в таком виде.
The purpose of computing is insight, not numbers

Ответить

Вернуться в «Общие вопросы»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 18 гостей