Trova un cubo più grande contenuto nell'unione dei cuboidi


18

Ho molti cuboidi nello spazio 3D, ognuno ha un punto di partenza su (x, y, z) e ha dimensioni di (Lx, Ly, Lz). Mi chiedo come trovare un cubo più grande in questo spazio 3D contenuto nell'unione dei cuboidi. Esiste un algoritmo efficiente per questo?

Ad esempio, se ho i seguenti cuboidi:

  • un cuboide che inizia con (0,0,0) con dimensioni (10,10,10),
  • un cuboide a (10,0,0) con dimensioni (12,13,15),
  • un cuboide a (0,10,0) con dimensioni (10,10,10),
  • un cuboide a (0,0,10) con dimensioni (10,10,10), e
  • un cuboide a (10,10,10) con dimensioni (9,9,9).

Quindi, il cubo più grande contenuto nell'unione di questi cuboidi sarà un cubo che inizia con (0,0,0) con dimensioni (19,19,19).

Una versione più generale di questa domanda:

Data una raccolta di caselle in R d , trova il più grande ipercubo contenuto nell'unione delle caselle.nRd


8
Penso che ci sia una domanda migliore nascosta all'interno: vale a dire, data un'unione di scatole in , calcolare il più grande ipercubo contenuto all'interno dell'unione. Rd
Suresh Venkat,

1
Questi cuboidi possono sovrapporsi?
Peter Boothe,

@Suresh, grazie per chiarire e generalizzare la domanda :) @Peter, nel mio caso ... Non si sovrapporrà :)
pantoffski,

2
Nel modo in cui lo hai definito, sembra che i lati dei cubi siano allineati con gli assi x, ye z. È questo il caso o i cubi possono avere orientamenti arbitrari? Questo ovviamente fa una differenza significativa per l'efficienza dell'algoritmo.
Joe Fitzsimons,

Nel mio caso, la faccia di ogni cuboide è ortogonale solo agli assi.
pantoffski

Risposte:


15

Bene, ecco una risposta sciocca al primo tentativo ... Prendi un aereo attraverso ciascuna faccia delle scatole rettangolari. Questa forma una griglia di dimensione . Non è difficile calcolare per ciascuna di queste celle della griglia sia all'interno che all'esterno dell'unione. Ora, da ciascun vertice della griglia, fai crescere un cubo (avendo questo vertice come vertice) cercando di renderlo il più grande possibile. Facendolo nel modo più ingenuo, ciò richiede O ( n 3 log n ) tempo per vertice, ma probabilmente usando la magia di ricerca della portata ortogonale, si dovrebbe essere in grado di farlo nel log O ( 1 ) n per vertice. Quindi O ( n 3O(n3)O(n3logn)logO(1)n dovrebbe essere possibile ...O(n3logO(1)n)

Un secondo tentativo: calcolare l'unione. In questo caso specifico, ciò può essere fatto in tempo (da piani ampi). Ora, osserva che devi solo calcolare il diagramma L voronoi del confine dell'unione. Utilizzando il risultato: http://vw.stanford.edu/~vladlen/publications/vor-polyhedral.pdf , questo può essere fatto in O ( n 2 + ε ) tempo, per una costante piccola arbitraria ε > 0 .O(nlogn)LO(n2+ε)ε>0

O(n2)


Grazie signore, penso anche che L∞ sia la soluzione migliore per questo problema finora. Da quando ho già realizzato il caso L∞ per 2D (implementato con i metodi forniti in questo documento inf.usi.ch/faculty/papadopoulou/publications/ijcga01.pdf ). Il caso 3D con solo scatole non dovrebbe essere molto difficile.
pantoffski

8

Rdd<0>01×1×1×n×n×n...×n hypercuboid.

2×2×...×21×1×...×1


Immagino che tu possa provare che è in FNP (almeno nel caso dei cuboidi allineati agli assi), eseguendo l'argomentazione di cui sopra al contrario e dimostrando che qualsiasi cuboide costituisce un vincolo che può essere verificato in tempo polinomiale.
Joe Fitzsimons
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.