У меня есть таблица MySQL со следующей структурой:MySQL 3D «Заливка» Реализация
CREATE TABLE IF NOT EXISTS `np_voxels` (
`world` VARCHAR(16) NOT NULL,
`x` INT NOT NULL,
`y` INT NOT NULL,
`z` INT NOT NULL,
`value` DOUBLE NOT NULL DEFAULT 0,
`property_id` INT NULL,
PRIMARY KEY (`world`, `x`, `y`, `z`) ,
INDEX `np_fk_voxels_properties_idx` (`property_id` ASC) ,
CONSTRAINT `np_fk_voxels_properties`
FOREIGN KEY (`property_id`)
REFERENCES `np_properties` (`property_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
Я хочу два запросов на выборку, которые могут найти все подключенные воксели данные исходный воксель, которые соответствуют определенному условию. Один WHERE world = @world AND value > @minvalue AND property_id IS NULL
, а другой WHERE world = @world AND property_id = @property_id
. Используемый алгоритм заполнения залива должен быть достаточно быстрым, чтобы он не вызывал заметного запаздывания (это будет использоваться на игровом сервере). Также должна быть ограничивающая рамка, расположенная на начальном вокселе, из которого запрос не может исчезнуть. На оси y
это будет идти от 0
до @ymax
. По умолчанию для этого будет 31
. Для оси x
и z
, это должно выходить @hdistance
от начала x
или z
.
Входной
@world
@startx
@starty
@startz
@minvalue
или@property_id
(Зависит, что программа ищет.)@hdistance
По умолчанию:13
@ymax
По умолчанию:31
Я искал в Google, и не нашел существующую реализацию в MySQL. Я не понимаю, как работают более быстрые и сложные алгоритмы заливки потока, чтобы попытаться написать это самостоятельно.
Быстрое наводнение не должно быть реализовано в SQL. Вы можете загружать все необходимые данные в ваше приложение в соответствующие структуры (возможно, некоторое представление графика или 3d-массив в зависимости от плотности ваших данных) и запускать стек/очередь или любую другую реализацию, которую вы можете записать на языке программирования.Потоп-заполнение по определению является рекурсивным (даже если оно часто реализуется циклами), а SQL не подходит для рекурсии или циклов. – jkavalik
@jkavalik Хорошая точка. Первоначально я думал, что это будет быстрее, если mysql выполнит такую обработку. Можете ли вы передать это как ответ, чтобы я мог отметить его как принятый? – Ruby