OBJECTE A (les coordenades són iguals per ambdós
exemples) ![]() |
OBJECTE B (les coordenades són diferents per a
cada exemple, però la representació és la mateixa) ![]() |
Objecte A Objecte B
Cares Vertexs Cares Vertexs
1:{3,4,8,7} 1:(0,0,0) 7:{11,12,16,15} 9:(1,2,2)
2:{2,6,8,4} 2:(3,0,0) 8:{10,14,16,12} 10:(2,2,2)
3:{1,5,6,2} 3:(0,0,3) 9:{ 9,13,14,10} 11:(1,2,5)
4:{1,3,7,5} 4:(3,0,3) 10:{ 9,11,15,13} 12:(2,2,5)
5:{5,7,8,6} 5:(0,3,0) 11:{13,15,16,14} 13:(1,4,2)
6:{1,2,4,3} 6:(3,3,0) 12:{ 9,10,12,11} 14:(2,4,2)
7:(0,3,3) 15:(1,4,5)
8:(3,3,3) 16:(2,4,5)
|
![]() |
Objecte A Objecte B
Cares Vertexs Cares Vertexs
1:{3,4,8,7} 1:(0,0,0) 7:{11,12,16,15} 9:(1,1,2)
2:{2,6,8,4} 2:(3,0,0) 8:{10,14,16,12} 10:(2,1,2)
3:{1,5,6,2} 3:(0,0,3) 9:{ 9,13,14,10} 11:(1,1,5)
4:{1,3,7,5} 4:(3,0,3) 10:{ 9,11,15,13} 12:(2,1,5)
5:{5,7,8,6} 5:(0,3,0) 11:{13,15,16,14} 13:(1,2,2)
6:{1,2,4,3} 6:(3,3,0) 12:{ 9,10,12,11} 14:(2,2,2)
7:(0,3,3) 15:(1,2,5)
8:(3,3,3) 16:(2,2,5)
|
![]() |
Exemple 1 Exemple 2 Cara 2: deAoutB Cara 2: deAoutB Cara 3: deAoutB Cara 3: deAoutB Cara 4: deAoutB Cara 4: deAoutB Cara 6: deAoutB Cara 5: deAoutB Cara 7: deBoutA Cara 6: deAoutB Cara 11: deBoutA Cara 7: deBoutA Cara 9: deBinA
Exemple 1 Exemple 2 Cara 5.1: deAoutB Cara 1.3: deAoutB Cara 5.2: deAinB Cara 1.4: deAinB Cara 1.1: deAoutB Cara 1.2: deAinB(les cares 1.1 i 5.1 tenen 8 arestes i tenen forma de "U", mentre que les cares 1.2 i 5.2 tenen 4 arestes; la cara 1.4 també té 4 arestes i la cara 1.3 té un forat de 4 arestes)
Exemple 1 Exemple 2 Cara 8.1: deBoutA Cara 8.3: deBoutA Cara 8.2: deBinA Cara 8.4: deBinA Cara 9.1: deBoutA Cara 10.3: deBoutA Cara 9.2: deBinA Cara 10.4: deBinA Cara 10.1: deBoutA Cara 11.3: deBoutA Cara 10.2: deBinA Cara 11.4: deBinA Cara 12.1: deBoutA Cara 12.3: deBoutA Cara 12.2: deBinA Cara 12.4: deBinA(totes les subcares son de 4 arestes excepte les 8.1 i 10.1 que tenen forma de "L" i tenen 6 arestes)
Exemple 1 Exemple 2
V 1: xyz, {4,3,6}, deAoutB V 1: xyz, {4,3,6}, deAoutB
V 2: xyz, {3,2,6}, deAoutB V 2: xyz, {3,2,6}, deAoutB
V 3: xyz, {1,4,6}, deAoutB V 3: xyz, {1,4,6}, deAoutB
V 4: xyz, {2,1,6}, deAoutB V 4: xyz, {2,1,6}, deAoutB
V 5: xyz, {5,3,4}, deAoutB V 5: xyz, {5,3,4}, deAoutB
V 6: xyz, {5,2,3}, deAoutB V 6: xyz, {5,2,3}, deAoutB
V 7: xyz, {1,5,4}, deAoutB V 7: xyz, {1,5,4}, deAoutB
V 8: xyz, {2,5,1}, deAoutB V 8: xyz, {2,5,1}, deAoutB
V 9: xyz, {9,10,12}, deBinA V 9: xyz, {9,10,12}, deBinA
V10: xyz, {9,8,12}, deBinA V10: xyz, {9,8,12}, deBinA
V11: xyz, {7,10,12}, deBoutA V11: xyz, {7,10,12}, deBoutA
V12: xyz, {8,7,12}, deBoutA V12: xyz, {8,7,12}, deBoutA
V13: xyz, {11,9,10}, deBoutA V13: xyz, {11,9,10}, deBinA
V14: xyz, {11,8,9}, deBoutA V14: xyz, {11,8,9}, deBinA
V15: xyz, {7,11,10}, deBoutA V15: xyz, {7,11,10}, deBoutA
V16: xyz, {8,11,7}, deBoutA V16: xyz, {8,11,7}, deBoutA
Encara que per evitar indeterminacions a la reconstrucció de les
cares pot ser interessant usar criteris de ciclicitat més estrictes,
aquí hem suposat que la llista de cares de cada vèrtex està
ordenada cíclicament basant-nos en el fet que existeix una aresta
entre cada cara i la seva següent a la llista, i que també
existeix una aresta comuna entre la darrera cara i la primera de la llista.
Pot ser interessant emmagatzemar també la convexitat o concavitat
de cadascuna de les arestes al voltant dels vértexs. Vegeu la pàgina
dels tests geomètrics per saber com calcular-la.
Exemple 1 Exemple 2
V17: xyz, {9,10,5}, Nou V23: xyz, {10,11,1}, Nou
V18: xyz, {8,9,5}, Nou V24: xyz, {11,8,1}, Nou
V19: xyz, {1,5,10}, Nou V25: xyz, {10,12,1}, Nou
V20: xyz, {1,5,8}, Nou V26: xyz, {12,8,1}, Nou
V21: xyz, {10,12,1},Nou
V22: xyz, {8,12,1}, Nou
(el vèrtex 17, per exemple, es troba com intersecció de l'aresta
V9-V13 de l'objecte B amb la cara 5 de l'objecte A. Les cares són
les 9,10,5 perquè l'aresta 9-13 de l'objecte B limita amb les cares
9 i 10; el mateix passa amb les altres arestes)
Fixeu-vos que les interseccions aresta - cara que cal fer en aquesta
fase, donen com a subproducte el test de si hi ha coincidències
entre A i B. Quan s'intersecta l'aresta a d'un objecte amb la cara c de
l'altre, únicament cal comprovar la posició del punt d'intersecció
P: Si el punt P coincideix amb un dels vèrtexs de l'aresta o bé
si P pertany a una de les arestes dels polígons de la cara, podem
afirmar que estem en un cas de coincidències i haurem de donar un
missatge i aturar l'algorisme. Si en canvi, P es troba entre els dos vèrtexs
de l'aresta i és interior a la cara haurem d'inserir aquest punt
a la llista LV de vèrtexs. Recordeu que el test de punt interior
a cara es pot fer en 2D a partir de les projeccions de P i c sobre un dels
plans coordenats (vegeu la pàgina
dels tests geomètrics). El càlcul de la convexitat
o concavitat de les noves arestes que es crein al voltant d'aquests vèrtexs
depèn tant sols de l'operació booleana que s'estigui realitzant,
tal com es mostra a la pàgina
dels tests geomètrics.
Exemple 1 Exemple 2
V 1: xyz, {4,3,6}, deAoutB V 1: xyz, {4,3,6}, deAoutB
V 2: xyz, {3,2,6}, deAoutB V 2: xyz, {3,2,6}, deAoutB
V 3: xyz, {1,4,6}, deAoutB V 3: xyz, {1,4,6}, deAoutB
V 4: xyz, {2,1,6}, deAoutB V 4: xyz, {2,1,6}, deAoutB
V 5: xyz, {5,3,4}, deAoutB V 5: xyz, {5,3,4}, deAoutB
V 6: xyz, {5,2,3}, deAoutB V 6: xyz, {5,2,3}, deAoutB
V 7: xyz, {1,5,4}, deAoutB V 7: xyz, {1,5,4}, deAoutB
V 8: xyz, {2,5,1}, deAoutB V 8: xyz, {2,5,1}, deAoutB
V 9: xyz, {9,10,12}, deBinA V 9: xyz, {9,10,12}, deBinA
V10: xyz, {9,8,12}, deBinA V10: xyz, {9,8,12}, deBinA
V13: xyz, {11,9,10}, deBinA
V14: xyz, {11,8,9}, deBinA
V17: xyz, {9,10,5}, Nou V23: xyz, {10,11,1}, Nou
V18: xyz, {8,9,5}, Nou V24: xyz, {11,8,1}, Nou
V19: xyz, {1,5,10}, Nou V25: xyz, {10,12,1}, Nou
V20: xyz, {1,5,8}, Nou V26: xyz, {12,8,1}, Nou
V21: xyz, {10,12,1},Nou
V22: xyz, {8,12,1}, Nou
El primer pas és sel.leccionar de la llista LV els vèrtexs que tenen la cara 1 a la seva llista de cares:
Exemple 1 Exemple 2
V 3: xyz, {4,1,6}, deAoutB V 3: xyz, {4,1,6}, deAoutB
V 4: xyz, {2,1,6}, deAoutB V 4: xyz, {2,1,6}, deAoutB
V 7: xyz, {4,1,5}, deAoutB V 7: xyz, {4,1,5}, deAoutB
V 8: xyz, {5,1,2}, deAoutB V 8: xyz, {5,1,2}, deAoutB
V19: xyz, {10,1,5}, Nou V23: xyz, {11,1,10}, Nou
V20: xyz, {8,1,5}, Nou V24: xyz, {8,1,11}, Nou
V21: xyz, {12,1,10},Nou V25: xyz, {12,1,10}, Nou
V22: xyz, {8,1,12}, Nou V26: xyz, {8,1,12}, Nou
Observació: per facilitar l'algorisme posterior de seqüenciar
els vèrtexs, hem fet una rotació circular dins de cada llista
de cares per tal que la cara que estem reconstruïnt (la cara 1) es
trobi al mig. Si tinguéssim algun vèrtex amb més de
tres cares a la seva llista, només caldria conservar-ne (en aquesta
fase) tres: la cara que estem reconstruïnt i les seves cares anterior
i posterior a la llista circular. Per tant, el resultat de l'extracció
de vèrtexs de la llista LV sempre té l'estructura que presentem
aquí, amb llistes reduïdes de tres cares per vèrtex.
Observació per a qui vulgui aprofundir: Tot i que aquí
no ho fem, si es vol evitar indeterminacions en la reconstrucció
de les cares, és bo imposar un sentit coherent a la subllista de
cares de cada vèrtex. El sentit és un de predeterminat (horari
o antihorari) quan observem el vèrtex en l'objecte final i des de
fora de l'objecte. Això comporta que en alguns casos cal invertir
la llista cíclica de cares. Observeu que el sentit depèn
de l'operació concreta que estem fent: un mateix vèrtex pot
requerir sentits diferents a la llista de les seves cares segons si estem
fent una operacio d'unió o una de diferència.
V3 ------> V4 ------> V8 ------> ? Cara 6 Cara 2 Cara 5El problema és que ara tenim tres vèrtexs candidats a ser els seguents de V8 compartint la cara 5: els 7, 19 i 20. Cal desfer la indeterminació. Aixo es pot fer de dues maneres:
V8 ------> V20 ------> V22 ------> V21 -------> V19 Cara 5 Cara 8 Cara 12 Cara 10 | | | Cara 5 | | V3 <------ V7 <-- Cara 4Observeu que hem reconstruït una cara amb un sol polígon que té com a vèrtexs
V3, V4, V8, V20, V22, V21, V19 i V7.
V3 ------> V4 ------> V8 ------> V7 ------> V3 Cara 6 Cara 2 Cara 5 Cara 4amb això hem tancat un cicle, pero el problema es que no hem passat per tots els vertexs de la subllista de la cara 1. Això ens indica que la nova cara de A - B que correspon a la cara 1 de A, té més d'un polígon. Continuem la reconstrucció amb els vèrtexs que ens queden:
V23 -------> V24 ------> V26 -------> V25 -------> V23 Cara 11 Cara 8 Cara 12 Cara 10Observeu que hem reconstruït una cara amb dos polígons que tenen com a vèrtexs,
V3, V4, V8 i V7 V23, V24, V26 i V25Finalment falta encara fer dues coses: