我有一个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
轴,这应该从起始x
或z
延伸出@hdistance
。
输入
@world
@startx
@starty
@startz
@minvalue
或@property_id
(取决于什么程序所期待的。)@hdistance
默认:13
@ymax
默认:31
我搜索谷歌,并没有发现在MySQL现有的实现。我不明白如何快速和更复杂的洪水填充算法努力尝试写我自己的。
快速填充不应该在SQL中实现。您可以将所有需要的数据加载到适当的结构(可能是一些图形表示或3D数组,取决于数据密度),然后运行堆栈/队列或任何其他可以使用编程语言编写的实现。按照定义递归填充(即使通常通过循环实现),SQL不适用于递归,也不适用于循环。 – jkavalik
@jkavalik好点。我原本以为如果mysql做了这样的处理会更快。你可以重新发布这个答案,以便我可以将其标记为已接受吗? – Ruby