(C ++) Необходимо выяснить все точки в радиусе, используя рег. 2D окна координат. система - PullRequest
2 голосов
/ 21 января 2009

Извините, я немного борюсь с тем, как это объяснить ... :)

По сути, у меня есть типичная система координат окон (сверху, слева - 0,0). Если кто-то знаком с запросом haversine, , как в SQL , он может получить все точки радиуса на основе координат широты и долготы.

Мне нужно что-то гораздо более простое, но мои математические навыки не все на должном уровне! По сути, у меня есть случайные точки, разбросанные по всему пространству 600x400. Мне нужно для любой точки X, Y на карте выполнить запрос, чтобы определить, сколько других точек находится в пределах данного радиуса этой.

Если это недостаточно описательно, просто дайте мне знать!

Ответы [ 5 ]

12 голосов
/ 21 января 2009

Прямой подход:

Вы можете рассчитать расстояние между точками, используя теорему Пифагора :

deltaX = x1 - x2
deltaY = y1 - y2
distance = square root of (deltaX * deltaX + deltaY * deltaY)

Для данной точки x1,y1, сделайте это для каждой другой точки (x2,y2), чтобы увидеть, находится ли рассчитанное расстояние в пределах (меньше или равном) вашего радиуса.

Если вы хотите ускорить его, рассчитайте и сохраните квадрат радиуса и просто сравните его с (deltaX * deltaX + deltaY * deltaY), избегая квадратного корня.

5 голосов
/ 21 января 2009

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

// Is (x1, y1) in the circle defined by center (x,y) and radius r
bool IsPointInCircle(x1, y1, x, y, r)
{
    if (x1 < x-r || x1 > x+r)
       return false;
    if (y1 < y-r || y1 > y+r)
       return false;
    return (x1-x)*(x1-x) + (y1-y)*(y1-y) <= r*r
}
4 голосов
/ 21 января 2009

Используйте Пифагора:

distance = sqrt(xDifference^2 + yDifference^2)

Обратите внимание, что '^' в этом примере означает «в степень», а не побитовый оператор XOR Си. Другими словами, идея состоит в том, чтобы возвести в квадрат оба различия.

2 голосов
/ 21 января 2009

Если вас интересует только относительное расстояние, вы не должны использовать квадратный корень, вы можете сделать что-то вроде:

 rSquared = radius * radius #square the radius
 foreach x, y in Points do
   dX = (x - centerX) * (x - centerX) #delta X
   dY = (y - centerY) * (y - centerY) #delta Y
   if ( dX + dY <= rSquared ) then
     #Point is within Circle
   end
 end
1 голос
/ 21 января 2009

Использование уравнения для круга :

radius ** 2 = (x - centerX) ** 2 + (y - centerY) ** 2

Мы хотим выяснить, находится ли точка (x, y) внутри круга. Мы выполняем тест, используя это уравнение:

radius ** 2 < (x - centerX) ** 2 + (y - centerY) ** 2

// (Or use <= if you want the circumference of the circle to be included as well)

Просто подставьте ваши значения в это уравнение. Если это работает (неравенство верно), точка находится внутри круга. В противном случае это не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...