• Nenhum resultado encontrado

Algoritmo para classifica¸c˜ao de um elemento em

4.4 Mapas esf´ericos e SBSP 3

5.1.1 Algoritmo para classifica¸c˜ao de um elemento em

rela¸c˜ao a um plano

α

O algoritmo ClassifyElement ´e utilizado para classificar os v´ertices e ares- tas de L em rela¸c˜ao ao plano separador. Esta opera¸c˜ao retorna a posi¸c˜ao de um elemento da lista L em rela¸c˜ao ao plano particionador α, i.e., se o ele-

procedure BuildSBSPTree3 (L:List of Elements, M’:Map); if L contiver somente faces then

Crie um n´o folha t e associe a este n´o as faces de L; return t;

else

Seja LF uma lista de faces inicialmente vazia; if existe uma aresta e na lista L then

Seja α o plano de suporte do c´ırculo associado a aresta e; else

Seja v um v´ertice na lista L e seja r a reta tal que ext(r)=v; Seja α um plano passando pela reta r;

Insira em M′

a oval gerada pelo plano α; for cada elemento elem de L do

if elem ´e v´ertice ou aresta then

ClassifyAndSplitElement( elem, α, L+, L−, L0);

else Insira elem na lista LF ;

Crie um n´o interno t e associe a este n´o o plano separador α; ClassifyFaces (L+,L−, LF , t); B+ = BuildSBSPTree3 (L+, M′); B− = BuildSBSPTree3 (L−, M′); B0 = BuildSBSPTree2 (L0, M ′ , 0);

Associe as ´arvores B+, B− e B0 as resp. referˆencias do n´o t;

return t;

end-BuildSBSPTree3

procedure ClassifyAndSplitElement(elem: MapElement, α :Plane, L+, L−, L0: List of Elements);

elementP os = ClassifyElement(elem, α); if elementP os = +2 then

Sejam p1 e p2 os pontos de interse¸c˜ao em M ′ ; Insira p1 e p2 em M ′ ; Sejam v1 e v2 os v´ertices de M ′ referentes a p1 e p2; L0 = L0∪ {v1, v2};

SplitArcs (elem,α, L+, L−) //Particione elem

else

if elementP os = +1 then L+= L+∪ {elem}

else

if elementP os = −1 then L− = L−∪ {elem}

else // O elemento est´a sobre α Seja e = Geometry(elem); Insira e em M′ ; Seja elem′ o elemento em M′ associado `a e; L0 = L0∪ {elem ′ }; end-ClassifyAndSplitElement

Figura 5.2: Algoritmo para classifica¸c˜ao e particionamento dos elementos. mento est´a localizado do lado positivo (retorna +1), negativo (retorna −1), ´e incidente (retorna +2) ou ´e atravessado (retorna 0) pelo plano α. A Figura 5.3 descreve o algoritmo ClassifyElement.

A classifica¸c˜ao de um ponto em rela¸c˜ao ao plano particionador consiste em determinar, de maneira exata, a posi¸c˜ao do ponto em rela¸c˜ao ao plano. Esta opera¸c˜ao ´e realizada pela fun¸c˜ao SideOf, descrita em Andrade [3], e tem como entrada um ponto p e um plano α e retorna +1 (resp.−1) quando p foi localizado no lado positvo (resp. negativo) de α; se p incide em α, ele retorna 0.

aresta ser uma oval ou um arco.

Na classifica¸c˜ao de uma oval, seja b o c´ırculo de suporte da oval e seja a o c´ırculo gerado pelo plano α. Assim, o processo de classifica¸c˜ao consiste em determinar se os c´ırculos a e b se interceptam ou n˜ao. Se n˜ao h´a interse¸c˜ao ent˜ao basta gerar um ponto sobre o c´ırculo b e classificar este ponto em rela¸c˜ao a α utilizando a fun¸c˜ao SideOf retornando +1 (resp. − 1) caso o ponto esteja do lado positivo (resp. negativo) de α. Caso contr´ario, se h´a interse¸c˜ao, ´e retornado o valor +2, indicando que a oval ´e atravessada pelo plano de parti¸c˜ao e deve ser particionada utilizando o algoritmo SplitArcs, descrito na se¸c˜ao 5.1.2. Se a oval ´e incidente ao plano, i.´e., se os planos de a e b s˜ao coincidentes ou s˜ao opostos, o algoritmo retorna 0.

Na classifica¸c˜ao de uma aresta-arco e, seja (p, (b), q) o arco associado `a aresta e e seja a o c´ırculo gerado pelo plano α. Primeiramente, ´e verificado se os c´ırculos b e a se interceptam. Se n˜ao houver interse¸c˜ao, basta retornar a posi¸c˜ao de um dos extremos do arco em rela¸c˜ao ao plano α. Caso contr´ario, se os c´ırculos b e a n˜ao s˜ao coincidentes e nem opostos, o algoritmo retorna +2 indicando que a aresta ´e atravessada pelo plano e deve ser particionada utili- zando o algoritmo SplitArcs; se eles forem coincidentes ou opostos, SplitArcs retorna 0.

´

E importante destacar que, apesar dos extremos de um arco n˜ao fazerem parte do mesmo, conforme descrito em 3.6.4, este algoritmo classifica o arco como sendo atravessado pelo c´ırculo mesmo que o ´unico ponto de interse¸c˜ao entre os dois seja um dos extremos do arco. Isto permite que o algoritmo SplitArcs identifique este arco com sendo atravessado pelo plano e insira o ponto de interse¸c˜ao na lista L0.

O algoritmo ClassifyElement tem como parˆametros de entrada o elemento (elem) a ser classificado e o plano separador (α) e retorna +2 quando elem ´e interceptado por α; 0 se elem ´e incidente no plano α, +1 ou −1 indicando que o elemento est´a do lado positivo ou negativo do plano, respectivamente. Para classificar as faces de L em rela¸c˜ao a α, o algoritmo ClassifyFaces, descrito na Figura 5.4, obt´em, inicialmente, as faces que possuem em sua fronteira pelo menos uma aresta situada sobre α e que est˜ao no lado positivo do plano. Estas faces s˜ao inseridas na lista L+. Para obter essas faces, seja c o

c´ırculo gerado pelo plano separador α; ent˜ao, percorra os elementos (v´ertices e arestas) de M′

que est˜ao sobre o c´ırculo c e, para cada um destes elementos, tome a face do mapa adjacente ao respectivo elemento e a insira na lista L+.

Para obter as faces situadas no lado negativo de α, repita esse procedimento percorrendo os elementos no sentido inverso de c inserindo as faces obtidas

procedure ClassifyElement (elem:MapElement, α:Plane); if elem ´e um v´ertice isolado then return SideOf (elem,α); Seja β o plano de suporte de elem;

if α e β s˜ao coincidentes ou opostos then return 0; if elem ´e uma oval then

if α ∧ β 6= φ then return +2 else

// Retorna a posi¸c˜ao de elem (aresta oval) em rela¸c˜ao `a α Gere um ponto p sobre elem;

return SideOf (p,α); if elem ´e uma aresta-arco then

if α ∧ β = φ then

// Retorna a posi¸c˜ao de elem (aresta-arco) em rela¸c˜ao `a α Seja p o ponto de origem da aresta-arco;

return SideOf (p,α); else

if (scrc(α) ∧ scircle(β)) ∈ elem then

// Indica que a aresta ´e atravessada por α return +2

else

Seja p o ponto sobre o v´ertice de origem de elem; return SideOf (p,α);

end-ClassifyElement.

Figura 5.3: Algoritmo para classifica¸c˜ao de um elemento em rela¸c˜ao `a um plano.

procedureClassifyFaces(L+, L−:List of Elements, LF:List of Faces,

t:n´o SBSP3);

Seja α o plano associado ao n´o t; GetFaces (t, L+, positive);

GetFaces (t, L−, negative);

for cada face f de LF do if f /∈ {L+∪ L−} then

Seja v um v´ertice da fronteira de f ; Seja p o ponto associado a v;

if SideOf (p, α) =+1 then L+ = L+∪ {f}

else if SideOf (p, α) =−1 then L− = L−∪ {f}

end-ClassifyFaces

Figura 5.4: Algoritmo para classifica¸c˜ao das faces em rela¸c˜ao ao plano α.

na lista L−. O algoritmo GetFaces, descrito na Figura 5.5, ´e respons´avel pela

identifica¸c˜ao destas faces.

Finalmente, o ClassifyFaces verifica se existe alguma face na lista L que ainda n˜ao foi classificada (n˜ao est´a em L+e L−). Se houver, isto significa que

a face n˜ao ´e adjacente a nenhum v´ertice ou aresta que est´a sobre α e, portanto, para classific´a-la, basta gerar um ponto sobre sua fronteira e classific´a-lo em rela¸c˜ao a α utilizando a fun¸c˜ao SideOf. Em fun¸c˜ao do resultado, a face ´e inserida na lista L+ ou L−.

O algoritmo ClassifyFaces tem como parˆametro as listas L+, L−, o n´o

corrente da SBSP3 e uma lista das faces de L. Ao final ele retorna as listas

L+ e L− com as faces de L distribu´ıdas pelas duas listas.

Documentos relacionados