Как рассчитать ячейку, которой принадлежит точка на бесконечной сетке / плоскости? - PullRequest
0 голосов
/ 31 января 2020

Допустим, у меня есть бесконечная плоскость (в компьютерной игре), на которой я лежу виртуальной сеткой квадратичных c ячеек сетки. Каждая ячейка имеет длину стороны len. Центр этой плоскости - и, следовательно, также как и сетки - находится в координатах X=0, Y=0. Поскольку плоскость имеет «бесконечный» размер (или, по крайней мере, очень большой), сетка проходит от своей центральной точки во все четыре направления, как положительные, так и отрицательные значения X и Y.

. Я получил случайную точку на плоскости, заданную как координаты px, py. Я хочу вычислить ячейку сетки, к которой принадлежит эта точка. Ячейка определяется как ее точка center, а также ее bounds (которая, я думаю, будет center + len / 2 во всех четырех направлениях).

Что было бы элегантным способом для вычисления обеих ячеек center и bounds?

Ответы [ 2 ]

2 голосов
/ 31 января 2020

При определении границ для прямоугольника вам нужны только две точки, где каждая точка представляет противоположные углы. Вы можете рассматривать одну точку как значения min x и min y, в то время как другая представляет значения max x и max y.

Нахождение индекса ячейки сетки

Чтобы узнать, какой ячейкой сетки мы являемся мы можем использовать

index_x = math.floor(px / len);
index_y = math.floor(py / len);

Ограничивающий прямоугольник из индекса

Если мы хотим найти точки на исходной координатной плоскости, которые описывают ячейку сетки в (index_x, index_y), мы можем сделать это:

min_x = index_x * len;
min_y = index_y * len;
max_x = min_x + len;
max_y = min_y + len;

Способ по модулю

В более элегантной версии используется оператор по модулю для вычисления остатка координаты при делении на длину ячеек сетки. Мы можем получить минимальную координату, удалив остаток от координаты.

min_x = px - (px % len);
min_y = py - (py % len);

Нахождение центра

Если вы хотите установить центральную точку для ограничительной рамки, вы можете сделать следующее:

center_x = min_x + len / 2;
center_y = min_y + len / 2;

Это зависит от того, что у коробки есть ребра длины len. Таким образом, центральная точка составляет половину длины от минимальных положений x и y.

Предупреждение

Если вы программируете это на компьютер, остерегайтесь Ошибка с плавающей запятой как это может вызвать некоторые неожиданные поведения. Как бы ни был хорош подход по модулю, он будет более подвержен ошибкам с плавающей запятой, чем math.floor.

0 голосов
/ 31 января 2020
bounds_x_min = math.floor(px / len);
bounds_x_max = bounds_x_min + 1;
center_x = average(bounds_x_min, bounds_x_max);

Версии y следуют той же схеме.

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