Найдите угловые точки куба со случайной точкой в ​​трехмерной сетке.

У меня есть координаты (x, y, z) для равномерно распределенной трехмерной сетки. Учитывая случайную трехмерную точку (x, y, z) где-то на сетке, как найти, у какого куба есть точка. Мне нужно знать 8 углов куба.
У меня есть данные о точках сетки в списке векторов на С++.

Спасибо.


person user1371031    schedule 09.05.2012    source источник


Ответы (2)


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

gx = x - x%l;
gy = y - y%l;
gz = z - z%l;

Где gx, gy, gz — координаты куба сетки, ближайшие к ориго (здесь я предполагаю, что x,y, z>=0), % — оператор модуля, а l — длина кубов сетки.

Примечание. Вы также можете выполнять вычисления таким образом: gx = static_cast<int>(x)/l*l; (static_cast<> для учета нецелого числа x)

Тогда 8 углов куба сетки (x, y, z) попадают в:

(gx, gy, gz)
(gx+l, gy, gz)
(gx, gy+l, gz)
(gx, gy, gz+l)
(gx+l, gy+l, gz)
(gx+l, gy, gz+l)
(gx, gy+l, gz+l)
(gx+l, gy+l, gz+l)
person Attila    schedule 09.05.2012

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

(nx, ny, nz) = [(x,y,z) / grid_size] * grid_size

где [x] — наибольшее целое число n, так что n<=x (на практике вы должны просто привести результат операции с плавающей запятой к int). Точки, которые вы ищете:

(nx, ny, nz)
(nx+grid_size, ny, nz)
(nx, ny+grid_size, nz)
(nx, ny, nz+grid_size)
(nx+grid_size, ny+grid_size, nz)
(nx+grid_size, ny, nz+grid_size)
(nx, ny+grid_size, nz+grid_size)
(nx+grid_size, ny+grid_size, nz+grid_size)
person miloszmaki    schedule 09.05.2012