Eu tenho muitos cuboides no espaço 3D, cada um tem um ponto de partida em (x, y, z) e tem tamanho de (Lx, Ly, Lz). Gostaria de saber como encontrar um cubo maior neste espaço 3D que está contido na união dos cuboides. Existe um algoritmo eficiente para isso?
Por exemplo, se eu tiver os seguintes cuboids:
- um cubóide com início em (0,0,0) com tamanho (10,10,10),
- um cubóide em (10,0,0) com tamanho (12,13,15),
- um cubóide em (0,10,0) com tamanho (10,10,10),
- um cubóide em (0,0,10) com tamanho (10,10,10), e
- um cubóide em (10,10,10) com tamanho (9,9,9).
Então, o maior cubo contido na união desses cubóides será um cubo começando em (0,0,0) com tamanho (19,19,19).
Uma versão mais geral desta pergunta:
Dado um conjunto de caixas em R d , encontrar o maior hypercube contido dentro da união das caixas.
ds.algorithms
cg.comp-geom
pantoffski
fonte
fonte
Respostas:
Bem, aqui está uma primeira tentativa de resposta tola ... Pegue um avião através de cada face das caixas retangulares. Forma uma grade de tamanho . Não é difícil calcular para cada célula da grade, seja dentro ou fora da união. Agora, a partir de cada vértice da grade, aumente um cubo (tendo esse vértice como um vértice) tentando torná-lo o maior possível. Fazendo isso da maneira mais ingênua, isso leva tempo O ( n 3 log n ) por vértice, mas provavelmente usando magia de busca de faixa ortogonal, deve-se ser capaz de fazê-lo no log O ( 1 ) n por vértice. Então O ( n 3O(n3) O(n3logn) logO(1)n deve ser possível ...O(n3logO(1)n)
Uma segunda tentativa: calcule a união. Nesse caso específico, isso pode ser feito no tempo (varrendo os planos). Agora, observe que você só precisa calcular o diagrama de L ∞ voronoi dos limites da união. Usando o resultado: http://vw.stanford.edu/~vladlen/publications/vor-polyhedral.pdf , isso pode ser feito no tempo O ( n 2 + ε ) , para uma constante pequena e arbitrária ε > 0 .O(nlogn) L∞ O(n2+ε) ε>0
Quebrar o tempo de execução vinculado aqui seria interessante, IMHO.O(n2)
fonte
fonte