Intersezione tra due parallelepipedi nello spazio

mostr
Salve a tutti!
Mi sono bloccato su un problema che probabilmente è abbastanza banale, ma non sono risuscito a trovare una soluzione.
Ho un parallelepipedo e un cubo in uno spazio 3D entrambi "paralleli" agli assi ( non so come si dice quando tutti i lati di ogni facccia sono paralleli a uno degli assi x,y,z e cioè che i due poliedri non hanno alcuna rotazione).
Sapendo le coordinate di tutti i vertici di ognuno dei poliedri (e quindi posso definire un intervallo [min,max] per ogni coordinata) devo verificare se si intersecano o meno.

Definiamo i due poliedri come P e C.
Molto velocemente posso dire che se le coordinate di un vertice di P sono comprese nei rispettivi intervalli di C (o viceversa) allora questi si intersecano.

Ora il problema è:
Nel caso nessuno dei vertici di P è interno a C (e viceversa) come faccio a verificarlo?

Grazie mille in anticipo.

Risposte
killing_buddha
Chiaramente un parallelepipedo è determinato univocamente dal dato dei suoi lati.

Siano allora $X,Y,Z$ e $x,y,z$ i lati dei due parallelepipedi $P$ e $p$: $P\cap p$ è diverso dal vuoto se e solo se tutti e tre i lati si intersecano non-nel-vuoto, cioè se (con una notazione un po' imprecisa ma chiara) \(X\cap x\neq \varnothing, Y\cap y\neq \varnothing, Z\cap z\neq \varnothing\).

E' necessario che tutti i lati si intersechino: prendi $P=p$ il cubo unitario: se trasli uno dei due cubi lungo uno degli assi (facciamo l'asse $e_3$) di un vettore di norma $>1$, i due cubi non si intersecano più.

E' sufficiente che tutti i lati si intersechino: segue dal fatto che $(X\times Y\times Z)\cap (x\times y\times z) = (X\cap x)\times (Y\cap y)\times (Z\cap z)$.

killing_buddha
Detto ciò, dovrebbe essere facile scrivere un programma che verifica queste condizioni date le coordinate dei vertici di un parallelepipedo; è questo che ti serve?

mostr
Grazie per la risposta e complimenti per aver intuito che ho a che fare con la programmazione di un software di simulazione grafica in 3D.

Purtroppo il tuo ragionamento riguardo i lati non mi torna molto, in particolare cosa intendi per intersezione tra lati in uno spazio 3D?
Se il parallelepipedo p interseca P esattamente all'interno di una sua faccia quali sono i lati interessati dall' intersezione?

Ti chiedo scusa, ma mi mancano delle nozioni geometria e vorrei cercare una soluzione di tipo algoritmico.

killing_buddha
Purtroppo il tuo ragionamento riguardo i lati non mi torna molto, in particolare cosa intendi per intersezione tra lati in uno spazio 3D?

Intendo che l'intervallo $[a,b]$ interseca $[a',b']$. Questo succede non appena $a\le a'\le b$ oppure $a\le b'\le b$, oppure entrambe queste condizioni insieme.

mostr
Ah ok perfetto! Questa mi sembra proprio la soluzione che stavo cercando, anzi a quanto pare non serve calcolare prima l' eventuale intersezione dei vertici, ma basta calcolare direttamente sui lati giusto?

killing_buddha
Come ti ho detto, $(X\times Y\times Z)\cap (x\times y\times z) = (X\cap x)\times (Y\cap y)\times (Z\cap z)$.

Questo implica direttamente che due sottoinsiemi della forma $X\times Y\times Z,x\times y\times z$ si intersecano se e solo se ciascun lato interseca l'altro.

A questo punto è facile capire cosa dire alla macchina (in cosa devi programmare?): "per i=1,2,3 controlla che il lato $L_i$ intersechi il lato $l_i$; alla prima istanza di lato che non lo fa, fermati e dimmi che le figure sono disgiunte; altrimenti finisci il ciclo."

A seconda del linguaggio in cui scrivi puoi farlo in $10^n$ modi. :)

mostr
Perfetto ora mi è tutto chiaro grazie mille sei stato molto preciso!

Comunque sto programmando in C++ e OpenGl e i problemi non sono finit qui :roll: ho un'altra domanda da chiedere per cui aprirò un' altra discussione :D

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.