Interrogació de Malles de Triangles

Orientabilitat de la malla

Una malla és orientable si tots els triangles estan orientats cap a la mateixa banda; en altres paraules, els vectors normals calculats a cada triangle en base a la orientació de les seves tres arestes han d'apuntar de forma coherent cap a la mateixa banda de la malla.

Una malla és orientable si, per tota semi-aresta que tingui una sola semi-aresta veina, les dues tenen sentits contraris (dues semi-arestes veines són les que comparteixen les mateixes dues cares). L'algorisme ha de recorrer tots els triangles, i per cada triangle les seves tres semi-arestes. Ara cal cercar la semi-aresta actual dins dels altres triangles de la malla. La malla és orientable si, per tota semi-aresta a la qual s'ha trobat una veina, les dues tenen sentits contraris.

Indirectament, el que estem fent és ampliar la informació topològica que guardem de la malla. Per a la malla inicial només guardavem la relació C:{V} i ara estem usant les relacions  C:{A} i  A:{C} ja que necessitem les semi-arestes. Per altres càlculs que presentarem més avall podem necessitar altres relacions com ara les A:{V} i  V:{C}. Totes elles es calculen fàcilment amb un recorregut per les llistes de la malla de triangles.

Càlcul de vores i de zones no dos-varietat

Una malla té vores si té semi-arestes que no tenen veines. Una malla té arestes que no són dos-varietat si trobem alguna semi-aresta amb més d'una veina.

L'algorisme és el seguent:

Per cada triangle t de la malla fer

BuscarComptar (t.V1, t.V2) ; Si ni=0 i nd=0 llavors AfegirLlistaVora (t.V1, t.V2 ) fisi
BuscarComptar (t.V2, t.V3) ; Si ni=0 i nd=0 llavors AfegirLlistaVora (t.V2, t.V3 ) fisi
BuscarComptar (t.V3, t.V1) ; Si ni=0 i nd=0 llavors AfegirLlistaVora (t.V3, t.V1 ) fisi

fiPer

El procediment BuscarComptar (V,W) busca i va comptant el nombre de vegades que la semi-aresta (V,W) es troba a la resta de triangles de la malla (exceptuant t). Al final,
Després del procediment BuscarComptar, tenim diverses possibilitats:

A l'algorisme anterior es guarden les arestes de la vora a una llista, pero podriem tenir altres llistes i guardar-hi altres tipus de semi-arestes: zones no orientables, zones no dos-varietat

Un cop acabat l'algorisme i detectades les vores, podem pintar les semi-arestes de la llista en un altre color per resaltar les vores, trobar cicles a la llista i pintar els diferents cicles de colors diferents, etc.

Qualitat de la malla

La qualitat d'una malla es medeix per la qualitat dels seus triangles. La qualitat d'un triangle es pot mesurar en base als seus angles:

Q = AngleMinim / SumaAngles     (on SumaAngles=180)
O bé en base a la longitut de les seves arestes:
Q = LongitutArestaMinima / Perimetre

La qualitat Q d'un triangle com podeu veure és un valor entre cero i 1/3. Un valor Q=1/3 vol dir que el triangle és equilater. Valors molt petits de Q estan relacionats amb triangles degenerats. La mesura en base als angles és en general més bona, perque detecta la degeneració dels triangles isòscels amb dos angles molt petits (podeu comprovar que en aquest cas, la qualitat en base a la longitut de les arestes no baixa de 1/4).

En una malla podem buscar i detectar el triangle de més baixa qualitat, detectar i/o pintar les zones amb triangles de qualitat més baixa que un cert llindar, etc. Els triangles de baixa qualitat (molt degenerats) poden donar problemes en els algorismes geomètrics i en el seu rendering.

Detecció d'auto-interseccions

Es important detectar si la malla s'auto-intersecta. Aquest és el test més complexe, perque cal comprovar i fer el test d'intersecció entre totes les parelles de triangles de la malla. Com veieu, el test és quadratic. Es pot accelerar amb tècniques de subdivisió espaial, guardant els triangles de la malla en una estructura d'octree o d'arbre BSP.

El test triangle-triangle es redueix a sis tests aresta-triangle (les tres arestes d'un triangle contra l'altre, i al revés). Per tant, el test aresta-triangle és el que cal optimitzar. Normalment es comença comprovant si cada un dels dos extrems de l'aresta és a una banda diferent del pla del triangle. Si és aixi, es pot testejar l'orientació dels tetraedres que es formen a partir dels 5 vèrtexs en joc.

Càlcul de característiques topològiques

Si la malla és correcta i tanca un volum (ho hem pogut detectar amb els tests anteriors, comprovant que és orientable, que no té vores i que no s'auto-intersecta), podem calcular les seves característiques topològiques i comprovar que es cumpleix l'equació d'Euler  C+V=A+2(S-H) . En cas que la malla no sigui correcta, molts dels algorismes geomètrics fallaran. La ùnica solució en aquest cas és la de reparar la malla i corretgir-la.

A partir del nombre d'elements de les dues llistes, sabem C i V. Com que sabem que 3*C=2*A, podem calcular el nombre d'arestes A. Amb un algorisme senzill d'inundació de vèrtexs, podem detectar el nombre de components connexes S:

S:=0;
mentre quedin vertexs no marcats fer
Escollir un primer vertex v ; Marcar(v) ; Afegir tots els seus veins (segons la relació V:{V} ) a una pila
mentre quedin vèrtexs a la pila fer
v:=desempilar(Pila)
Marcar (v)
Afegir tots els seus veins no marcats a la pila
fmentre
S:=S+1
fmentre

Finalment, el nombre forats passants H el trobarem despejant a partir de l'equació d'Euler, ja que coneixem tots els altres termes.

Pla tangent i curvatures

El pla tangent a la malla en un vèrtex és el pla perpendicular al vector normal. Com que coneixem un punt de pas (el propi vèrtex), el problema és equivalent al del càlcul del vector normal.

Una possibilitat per calcular el vector normal és calcular el vector normal del poligon "corona" del vèrtex, usant la fòrmula ja coneguda a VIG (veure el capítol de geometria al CD de VIG). El polígon corona d'un vèrtex v de la malla és el poligon format per tots els vèrtexs que es troben a distància d'una aresta respecte v (en altres paraules, és el poligon que formen els vèrtexs de la llista que retorna la relació topològica  v:{V} ).

Una segona possibilitat per a calcular el vector normal a un vèrtex v de la malla és calcular el vector ponderat de totes les cares veines a v, segons la seva àrea:
normal := 0
Per cada cara c veina de v fer
normal := normal + c.normal / Area(c)
fiPer
Normalitza(normal)

Si volem estimar la curvatura a un vèrtex v de la malla, podem usar el mètode proposat per Gabriel Taubin: Primer es calcula el vector normal a v i el pla tangent (pi). A continuació, per a cada aresta a que conflueix a v, calculem el pla pi_a com el pla que passa per a i és perpendicular a pi. Aquest pla pi_a és el pla normal a la superficie en v i en la direcció de a. Ara, amb un senzill càlcul geomètric, es calcula el radi de curvatura a la secció normal definida pel pla pi_a: dins del pla pi_a, és el radi R de la circumferència que passa per v i per l'altra extrem de l'aresta a, i que a més és tangent, en el punt v, a la recta intersecció entre els plans pi, pi_a. A aquest radi R li donarem signe positiu si el centre de la circumferència es troba en sentit contrari al vector normal desde el punt v, i signe negatiu en cas contrari. La curvatura normal a v en la direcció de l'aresta a és ara 1/R. Un cop ha calculat aquestes curvatures per a totes les arestes, Taubin calcula una quàdrica aproximant a la superficie en el punt v i el càlcul dels seus valors i vectors propis ens dóna finalment les curvatures i direccions principals.

Superficie i volum tancat per la malla

Si ja hem fet les comprovacions anteriors i hem vist que la malla és correcta, podem aplicar directament els algorismes per models BRep de l'apartat 2.2.3.