Mesh representations and data structures Luca Castelli Aleardi - - PowerPoint PPT Presentation

mesh representations and data structures
SMART_READER_LITE
LIVE PREVIEW

Mesh representations and data structures Luca Castelli Aleardi - - PowerPoint PPT Presentation

Mesh representations and data structures Luca Castelli Aleardi Shared vertex representation Half-edge DS Winged edge Triangle based DS Corner Table easy to implement Shared vertex representation quite compact not efficient for traversal 8


slide-1
SLIDE 1

Mesh representations and data structures

Luca Castelli Aleardi

slide-2
SLIDE 2

Shared vertex representation Half-edge DS Winged edge Triangle based DS Corner Table

slide-3
SLIDE 3

Shared vertex representation

class Point{ double x; double y; }

class Vertex{ Point p; }

combinatorial information

geometric information

class Face{ Vertex[] vertices; }

3 7 11 6 5 10 1 9 8 2 4

f

t0 t1 t2 t3 t4 tf

faces

v0 v1 v2 v3

vertex locations

vn−1

(x0, y0, z0) (x1, y1, z1) . . . . . .

t5

. . . . . . . . . . . . . . . . . . v1 . . . v3 v2 v3 . . . v3 v1 v2 for each face (of degree d), store:

  • d references to incident vertices

for each vertex, store:

  • 1 reference to its coordinates

3 × f = 6n

Size (number of references)

quite compact not efficient for traversal

Queries/Operations

Find the 3 neighboring faces of f

Memory cost

List the neighbors of vertex v

easy to implement

Test adjacency between u and v List all vertices or faces

slide-4
SLIDE 4

Half-edge data structure: polygonal (orientable) meshes

  • pposite(e)

class Halfedge{ Halfedge prev, next, opposite; Vertex v; Face f; }

class Point{ double x; double y; }

class Vertex{ Halfedge e; Point p; }

combinatorial information

geometric information

class Face{ Halfedge e; }

vertex(e) e

prev(e) next(e) face(e)

3 7 11 6 5 10 1 9 8 2 4

e

f + 5 × h + n ≈ 2n + 5 × (2e) + n = 32n + n

Size (number of references)

slide-5
SLIDE 5

Half-edge data structure: polygonal (orientable) meshes

  • pposite(e)

class Halfedge{ Halfedge prev, next, opposite; Vertex v; Face f; }

class Point{ double x; double y; }

class Vertex{ Halfedge e; Point p; }

combinatorial information

geometric information

class Face{ Halfedge e; }

vertex(e) e

next(e)

3 7 11 6 5 10 1 9 8 2 4

e

3 × h + n ≈ 3 × (2e) + n = 18n + n

Size (number of references)

slide-6
SLIDE 6

Half-edge data structure: efficient traversal

  • pposite(e)

vertex(e) e

prev(e) next(e)

e = v.halfedge e.next v

slide-7
SLIDE 7

Half-edge data structure: efficient traversal

  • pposite(e)

vertex(e) e

prev(e) next(e)

e e.next e.next.opposite

slide-8
SLIDE 8

Half-edge data structure: efficient traversal

  • pposite(e)

vertex(e) e

prev(e) next(e)

e e.next.opposite e.next.opposite.next

slide-9
SLIDE 9

Half-edge data structure: polygonal manifold meshes

  • pposite(e)

vertex(e) e

prev(e) next(e)

yes

can we represent them?

slide-10
SLIDE 10

class Triangle{ Triangle t1, t2, t3; Vertex v1, v2, v3; } class Point{ float x; float y; float z; } class Vertex{ Triangle root; Point p; }

Triangle based DS: for triangle meshes

(3 + 3) × f + n = 6 × 2n + n = 13n

Size (number of references)

connectivity

for each triangle, store:

t0 t1 t2 t3 t4 tf

T

v0 v1 v2 v3

. . . . . .

V

v0 v3 v2 v1 t2

t2 . . . . . . . . .

vn−1

(x0, y0, z0) (x1, y1, z1) . . . . . . . . . . . . . . . . . . . . .

  • 3 references to neighboring faces
  • 3 references to incident vertices

t1 t0 t2 t5

. . . . . . . . .

t5

. . . . . . . . . . . . . . . . . . v1 . . . v3 . . . . . . v2 v3 . . . t2 t5 t0 v3 v1 v2 for each vertex, store:

  • 1 reference to an incident face

(used in CGAL)

slide-11
SLIDE 11

Triangle based DS: mesh traversal operators

class Triangle{ Triangle t1, t2, t3; Vertex v1, v2, v3; } class Point{ float x; float y; float z; } class Vertex{ Triangle root; Point p; }

connectivity

the data structure supports the following operators

q p v △

i i+1 i+2

g1 = neighbor(△, ccw(i))

g0 g1 g2

g2 = neighbor(△, cw(i)) g0 = neighbor(△, i) △ = face(v)

z

z = vertex(g2, faceIndex(g2, △)) v = vertex(△, i)

int degree(int v) { int d = 1; int f = face(v); int g = neighbor(f, cw(vertexIndex(v, f))); while (g ! = f) {

i = vertexIndex(v, △)

int cw(int i) {return (i + 2)%3; } int ccw(int i) {return (i + 1)%3; } int next = neighbor(g, cw(faceIndex(f, g))); int i = faceIndex(g, next); g = next; d + +; } return d; }

we can turn around a vertex, by com- bining the operators above we can locate a point, by per- forming a walk in the triangula- tion

slide-12
SLIDE 12

Triangle based DS: mesh update operators

class Triangle{ Triangle t1, t2, t3; Vertex v1, v2, v3; } class Point{ float x; float y; float z; } class Vertex{ Triangle root; Point p; }

connectivity

the data structure supports the following operators

g2

splitFace(f) removeVertex(v) edgeFlip(e)

g1 g1 g2

edgeFlip(e)

e g0 splitFace(f) removeVertex(v) v

all these operators can be performed in O(1) time

the data structure is modifiable