Клуб API Карт

Проверить, принадлежит ли точка окружности

Пост в архиве.

Предупрежу сразу, с координатами столкнулся впервые) Задача у меня крайне проста - определить, входит ли точка в окружность на карте. Средствами YAPI это слеть легко, в песичнице есть простой пример. А как такой же расчет реализовать средствами других языков программирования? 

 

Сначала я думал, что все легко. Есть точка (X,Y), есть центр окружности (X1,Y1), простой формулой проверяю, входит ли точка в оуружность

(x-x1)^2 + (y-y1)^2 <= R^2, где R - радиус окружности. Радиус не нужен был крайне точным, по картам провел линейкой 1км, координаты сдвинулись на 0,032 градуса. Эту величину и подставлял в R, из расчета что 0,0132 градуса = 1км. Обрадовался, напился.


Далее возникла проблема. В выборку попадали точки и окружности, которые по идее не должны в нее попадать. И попадали очень странно, только когда точка СВЕРХУ круга. Начал курить далее. Провел по ссвоему супер способу линеечку вверх, и увидел, что по оси Y одному километр - это примерно 0,009 градусов. Сразу же дошло, что наша планетка Земля в развернутом виде в ширину больше, чем в высоту, и мой "круг" для карты - это огромный овал. Оттуда и правило - не считай километры по градусам, ибо это быдлокод и повод для насмешек.


Собственно теперь возникла проблема, как найти точку на карте, которая принадлежит кругу, или как работает функция, которая высчитывает вхождение, как например тут 


Нашел коммент с формулой на MySQL, но, во-первых, не пойму, то ли это, во-вторых, непонятны некоторые переменные в запросе

6 комментариев

Вам нужно овладеть древними знаниями - сферической тригонометрией. Все, кто знает сферическую тригонометрию, умеют считать попадание точки в окружность в уме даже в ночь с 1 на 4е января.

Мы не из этих. Мы сферической триногометрией не овладели и с позором делаем так - любую фигуру мы проецируем на земной шар и смотрим пересечение уже самих проекций (это ответ на вопрос, как у нас работает geoQuery).

 В вашей конкретной задаче достаточно научиться считать расстояние между двумя точками по координатам (точка и центр окружности). Если расстояние меньше или равно радиусу, то точка принадлежит окружности.

Расчет расстояния обсуждался в клубе. Вот например здесь.

 

Спасибо)) Буде курить. Вам надо было написать так: "Вам нужно овладеть древними знаниями - сферической тригонометрией. Вот вам древний артефакт Амулет истины"

В MySQL есть spatial indexes и они это умеют

в си это делается так

#include <stdio.h>
#include <stdlib.h>
#include <Math.h>
int main()
{
float x,y,result, R;
printf("Enter a radius value\n");
scanf("%f",&R);
printf("Enter the coordinates of the point\n");
scanf("%f",&x);
scanf("%f",&y);
if(x>=-R && x<=R && y<=powl((R*R-x*x),1.0/2) && y>=-powl((R*R-x*x),1.0/2))
{
printf("The point belongs to the circle\n");
main();
}
else
{
printf("The point does not belong to the circle\n");
main();
}
getchar();
getchar();
return(0);
}