Data Structures in Triangle Meshes

Data Structure
of Triangle Meshes
Yutaka Ohtake
Department of Precision Engineering
The University of Tokyo
Contents
Adjacent vertex lists
Example of usage 
: computing Laplacians
Adjacent face lists
Example of usage 
: computing vertex normals
Face mates
Example of usage 
: linear subdivision
2
Adjacent Vertex Lists
(vertex-to-vertices)
At each vertex,
        we store the neighboring vertices.
0
8
6
7
3
5
1
2
4
List 0 : {1,5,6,7}
List 1 : {5,2,0}
(Please complete here)
3
Data Structure
Two dimensional array
                           with varying their lengths.
int *listSizes;
int **adLists;
void printAdjacentList(int i){
  int size = listSizes[i];
  int* list = adLists[i];
  for(int j=0; j<size; j++){
    printf(“%d-th vertex is adjacent to %d-th vertex\n”,
            list[j], i);
  }
}
4
Algorithm of List Construction
For each triangle (A, B, C)
Append A to B's
 
list
Append B to C's list
Append C to A's list
Actually, the above can not compute the correct lists 
in some cases. Please indicate such cases.
5
Implementation
(For the people who do not like std::vector)
listSizes = new int[numVertices];
for(int i=0; i<numVertices; i++)
  listSizes[i] = 0;
for(int i=0; i<numTriangles; i++)
  for(int j=0; j<3; j++)
    
listSizes[triangles[i][j]]++;
adLists = new int*[numVertices];
for(int i=0; i<numVertices; i++){
  
adLists[i] = new int[listSizes[i]];
  listSizes[i] = 0;
}
for(int i=0; i<numTriangles; i++){
  int* t = triangles[i];
  for(int j=0; j<3; j++)
    
adLists[t[j]][listSizes[t[j]]++] = t[(j+1)%3];
}
1. Count the size of lists
      for memory allocation.
2. Construct the list.
6
Computing Laplacians
(Re-visited)
Using adjacent vertex lists,
  you can compute Laplacian at a vertex
                   without traversing all triangles.
Please re-implement Laplacian smoothing 
by using adjacent lists
7
Contents
Adjacent vertex lists
Example of usage 
: computing Laplacians
Adjacent face lists
Example of usage 
: computing vertex normals
Face mates
Example of usage 
: linear subdivision
8
Adjacent Face Lists
(vertex-to-faces)
At each vertex,
        we store the neighboring triangles.
0
8
6
7
3
5
1
2
4
List 0 : {0,4,5}
List 1 : {1,0}
(Please complete here)
0
1
2
3
4
5
6
7
8
9
Data Structure
Same as vertex-to-vertices list.
int *listSizes;
int **adLists;
void printAdjacentList(int i){
  int size = listSizes[i];
  int* list = adLists[i];
  for(int j=0; j<size; j++){
    printf(“%d-th 
triangle
 is adjacent to %d-th vertex\n”,
            list[j], i);
  }
}
10
Algorithm of List Construction
For each triangle (A, B, C)
Append the triangle ID to B's list
Append the triangle ID to C's list
Append the triangle ID to A's list
Please implement the above. 
Then re-implement vertex normal computation 
by using the list for vertex-to-triangles. 
11
Contents
Adjacent vertex lists
Example of usage 
: computing Laplacians
Adjacent face lists
Example of usage 
: computing vertex normals
Face mates
Example of usage 
: linear subdivision
12
Face mates (face-to-faces)
At each triangle, we store
            the three triangles sharing the edges.
1
7
2
8
5
3
0
4
6
0-th triangle (0,3,1): 
[4,9,1]
1-st triangle (0,4,3): 
[2,0,-1]
(Please complete here)
0
1
2
3
9
5
6
7
8
9
4
No mate
13
Algorithm of Mate Construction
1.
Construct the adjacent face lists.
2.
For the i-th triangle (A,B,C)
1.
Set mate for A to the triangle (not i-th)
                        containing B in the C's list
2.
Set mate for B to the triangle (not i-th)
                        containing C in the A's list
3.
Set mate for C to the triangle (not i-th)
                        containing A in the B's list
B
C
A
i
Mate for A
14
Implementation
int (*mates)[3];
void constructFaceMates(){
  constructAdjacentFaceLists();
  mates = new int[numTriangles][3];
  for(int i=0; i<numTriagles; i++){
    for(int j=0; j<3; j++){
      mate[i][j] = -1;
      int v = triangles[i][(j+1)%3];
      int size = listSizes[triangles[i][(j+2)%3]];
      int* list = adLists[triangles[i][(j+2)%3]];
      for(int k=0; k<size; k++){
        if(list[k] == i) continue;
        int *tk = triangles[list[k]];
        if(tk[0] == v || tk[1] == v || tk[2] == v){
          
mate[i][j] = list[k]; 
break;
        }
      }
    }
  }
}
Vertex ID 
to be searched
15
Edges
Let’s consider only 
2-manifold meshes
Edges are shared by one or two triangles
Inner edge
(shared by 
two triangles)
Boundary edge
(shared by 
one triangles)
Non-manifold edge
(shared by 
more than tree
 triangles)
We can identify them using mate data.
16
Counting Edges
Please complete
           the function for counting edges.
int numEdges;
void countEdges(){
  constructFaceMates();
  numEdges = 0;
  //Increment #edges by traversing mates
  for(int i=0; i<numTriangles; i++){
    //???
  }
}
17
Assigning Edge IDs to Triangles
From each triangle,
         we store the three edge IDs.
Numbering edges are not unique.
1
2
4
5
0
3
0
1
2
3
4
1
5
6
7
8
9
2
0
6
5
3
4
11
10
0-th triangle (5,4,2): 
[5,4,1]
1-st triangle (6,5,2): 
[4,10,7]
(Please complete here)
18
Assigning Edge IDs
Please complete
       the function for assigning edge IDs.
int (*edgeIDs)[3];
int numEdges;
void assignEdgeIDs(){
  constructFaceMates();
  numEdges = 0;
  edgeIDs = new int[numTriangles][3];
  for(int i=0; i<numTriangles; i++){
    //???
  }
}
HINT : you can do it together with counting #edges.
19
Mesh Subdivision
Triangles are subdivided
                            using a certain rule.
1-to-4 linear subdivision
20
#vertices and #triangles
after 1-to-4 subdivision
#(new triangles) = 4 times #(old triangles)
#(new vertices)  = #(old vertices) + #(old edges)
Old mesh
New mesh
21
Vertex IDs of New Mesh
ID of a new vertex on an old edge =
           ID of the old edge + 
#(old vertices)
A
B
C
D
F
E
Denoted by V
(A, D+V, E+V)
(Please complete here)
Subdivided four triangles
22
Algorithm of
1-to-4 Linear Subdivision
1.
Compute edge IDs with counting #edges
2.
Allocate memory
       for the new vertices and triangles
3.
Compute the new vertex positions
4.
Create the new triangles
5.
Update the mesh data
23
Implementation
//Step 1.
assignEdgeIDs();
//Step 2.
float (*newVerteces)[3] = new float[numVertices + numEdges];
int (*newTriangles)[3] = new int[4*numTriangles];
//Step 3. (Complete here)
//Step 4. (Complete here)
//Step 5.
delete[] vertices;
delete[] triangles;
vertices = newVertices;
triangles = newTriangles;
numVertices += numEdges;
numTriangles *= 4;
24
Slide Note
Embed
Share

Delve into the data structure of triangle meshes, as explained by Yutaka Ohtake from the Department of Precision Engineering at the University of Tokyo. Explore adjacent vertex and face lists, as well as the construction algorithms for creating these lists. Learn about the implementation methods, laplacian computations, and more in this comprehensive guide to handling triangle mesh data structures.

  • Data Structures
  • Triangle Meshes
  • Vertex Lists
  • Face Lists
  • Laplacians

Uploaded on Sep 22, 2024 | 0 Views


Download Presentation

Please find below an Image/Link to download the presentation.

The content on the website is provided AS IS for your information and personal use only. It may not be sold, licensed, or shared on other websites without obtaining consent from the author. Download presentation by click this link. If you encounter any issues during the download, it is possible that the publisher has removed the file from their server.

E N D

Presentation Transcript


  1. Data Structure of Triangle Meshes Yutaka Ohtake Department of Precision Engineering The University of Tokyo

  2. Contents Adjacent vertex lists Example of usage : computing Laplacians Adjacent face lists Example of usage : computing vertex normals Face mates Example of usage : linear subdivision 2

  3. Adjacent Vertex Lists (vertex-to-vertices) At each vertex, we store the neighboring vertices. List 0 : {1,5,6,7} List 1 : {5,2,0} (Please complete here) 1 0 2 5 6 7 3 4 8 3

  4. Data Structure Two dimensional array with varying their lengths. int *listSizes; int **adLists; void printAdjacentList(int i){ int size = listSizes[i]; int* list = adLists[i]; for(int j=0; j<size; j++){ printf( %d-th vertex is adjacent to %d-th vertex\n , list[j], i); } } 4

  5. Algorithm of List Construction For each triangle (A, B, C) Append A to B's list Append B to C's list Append C to A's list Actually, the above can not compute the correct lists in some cases. Please indicate such cases. 5

  6. Implementation (For the people who do not like std::vector) 1. Count the size of lists for memory allocation. listSizes = new int[numVertices]; for(int i=0; i<numVertices; i++) listSizes[i] = 0; 2. Construct the list. for(int i=0; i<numTriangles; i++){ int* t = triangles[i]; for(int j=0; j<3; j++) adLists[t[j]][listSizes[t[j]]++] = t[(j+1)%3]; adLists[t[j]][listSizes[t[j]]++] = t[(j+1)%3]; } for(int i=0; i<numTriangles; i++) for(int j=0; j<3; j++) listSizes[triangles[i][j]]++; adLists = new int*[numVertices]; for(int i=0; i<numVertices; i++){ adLists[i] = new int[listSizes[i]]; listSizes[i] = 0; } 6

  7. Computing Laplacians (Re-visited) Using adjacent vertex lists, you can compute Laplacian at a vertex without traversing all triangles. 1 neighbors = p p q ( ) L i # neighbors q i Please re-implement Laplacian smoothing by using adjacent lists 7

  8. Contents Adjacent vertex lists Example of usage : computing Laplacians Adjacent face lists Example of usage : computing vertex normals Face mates Example of usage : linear subdivision 8

  9. Adjacent Face Lists (vertex-to-faces) At each vertex, we store the neighboring triangles. List 0 : {0,4,5} List 1 : {1,0} (Please complete here) 1 0 0 2 1 5 4 2 5 3 6 7 3 6 8 7 4 8 9

  10. Data Structure Same as vertex-to-vertices list. int *listSizes; int **adLists; void printAdjacentList(int i){ int size = listSizes[i]; int* list = adLists[i]; for(int j=0; j<size; j++){ printf( %d-th triangle is adjacent to %d-th vertex\n , list[j], i); } } 10

  11. Algorithm of List Construction For each triangle (A, B, C) Append the triangle ID to B's list Append the triangle ID to C's list Append the triangle ID to A's list Please implement the above. Then re-implement vertex normal computation by using the list for vertex-to-triangles. 11

  12. Contents Adjacent vertex lists Example of usage : computing Laplacians Adjacent face lists Example of usage : computing vertex normals Face mates Example of usage : linear subdivision 12

  13. Face mates (face-to-faces) At each triangle, we store the three triangles sharing the edges. 9 0-th triangle (0,3,1): [4,9,1] 1-st triangle (0,4,3): [2,0,-1] (Please complete here) 0 9 4 1 1 0 3 4 2 5 3 2 8 5 6 8 7 6 7 No mate 13

  14. Algorithm of Mate Construction 1. Construct the adjacent face lists. 2. For the i-th triangle (A,B,C) 1. Set mate for A to the triangle (not i-th) containing B in the C's list 2. Set mate for B to the triangle (not i-th) containing C in the A's list 3. Set mate for C to the triangle (not i-th) containing A in the B's list C i Mate for A A B 14

  15. Implementation int (*mates)[3]; void constructFaceMates(){ constructAdjacentFaceLists(); mates = new int[numTriangles][3]; for(int i=0; i<numTriagles; i++){ for(int j=0; j<3; j++){ mate[i][j] = -1; int v = triangles[i][(j+1)%3]; int size = listSizes[triangles[i][(j+2)%3]]; int* list = adLists[triangles[i][(j+2)%3]]; for(int k=0; k<size; k++){ if(list[k] == i) continue; int *tk = triangles[list[k]]; if(tk[0] == v || tk[1] == v || tk[2] == v){ mate[i][j] = list[k]; break; } } } } } Vertex ID to be searched 15

  16. Edges Let s consider only 2-manifold meshes Edges are shared by one or two triangles Inner edge (shared by two triangles) Boundary edge (shared by one triangles) Non-manifold edge (shared by more than tree triangles) We can identify them using mate data. 16

  17. Counting Edges Please complete the function for counting edges. int numEdges; void countEdges(){ constructFaceMates(); numEdges = 0; //Increment #edges by traversing mates for(int i=0; i<numTriangles; i++){ //??? } } 17

  18. Assigning Edge IDs to Triangles From each triangle, we store the three edge IDs. Numbering edges are not unique. 0 8 0-th triangle (5,4,2): [5,4,1] 1-st triangle (6,5,2): [4,10,7] (Please complete here) 1 6 3 2 9 3 2 11 5 3 5 7 4 6 0 1 1 4 10 0 4 5 2 18

  19. Assigning Edge IDs Please complete the function for assigning edge IDs. int (*edgeIDs)[3]; int numEdges; void assignEdgeIDs(){ constructFaceMates(); numEdges = 0; edgeIDs = new int[numTriangles][3]; for(int i=0; i<numTriangles; i++){ //??? } } HINT : you can do it together with counting #edges. 19

  20. Mesh Subdivision Triangles are subdivided using a certain rule. 1-to-4 linear subdivision 20

  21. #vertices and #triangles after 1-to-4 subdivision #(new triangles) = 4 times #(old triangles) #(new vertices) = #(old vertices) + #(old edges) Old mesh New mesh 21

  22. Vertex IDs of New Mesh ID of a new vertex on an old edge = ID of the old edge + #(old vertices) Denoted by V A Subdivided four triangles (A, D+V, E+V) D E (Please complete here) B F C 22

  23. Algorithm of 1-to-4 Linear Subdivision 1. Compute edge IDs with counting #edges 2. Allocate memory for the new vertices and triangles 3. Compute the new vertex positions 4. Create the new triangles 5. Update the mesh data 23

  24. Implementation //Step 1. assignEdgeIDs(); //Step 2. float (*newVerteces)[3] = new float[numVertices + numEdges]; int (*newTriangles)[3] = new int[4*numTriangles]; //Step 3. (Complete here) //Step 4. (Complete here) //Step 5. delete[] vertices; delete[] triangles; vertices = newVertices; triangles = newTriangles; numVertices += numEdges; numTriangles *= 4; 24

More Related Content

giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#