98 const CornerTableT *corner_table) {
100 vertex_to_component_map_.assign(corner_table->num_vertices(), -1);
101 face_to_component_map_.assign(corner_table->num_faces(), -1);
102 boundary_corner_to_component_map_.assign(corner_table->num_corners(), -1);
103 std::vector<int> is_face_visited(corner_table->num_faces(),
false);
104 std::vector<int> face_stack;
108 for (
int face_id = 0; face_id < corner_table->num_faces(); ++face_id) {
109 if (is_face_visited[face_id]) {
112 if (corner_table->IsDegenerated(
FaceIndex(face_id))) {
115 const int component_id = components_.size();
117 face_stack.push_back(face_id);
118 is_face_visited[face_id] =
true;
119 while (!face_stack.empty()) {
120 const int act_face_id = face_stack.back();
121 if (face_to_component_map_[act_face_id] == -1) {
122 face_to_component_map_[act_face_id] = component_id;
123 components_[component_id].faces.push_back(act_face_id);
125 face_stack.pop_back();
127 std::array<CornerIndex, 3> corners =
128 corner_table->AllCorners(
FaceIndex(act_face_id));
129 for (
int c = 0; c < 3; ++c) {
131 const int vertex_id = corner_table->Vertex(corners[c]).value();
132 if (vertex_to_component_map_[vertex_id] == -1) {
133 vertex_to_component_map_[vertex_id] = component_id;
134 components_[component_id].vertices.push_back(vertex_id);
137 const CornerIndex opp_corner = corner_table->Opposite(corners[c]);
138 if (opp_corner == kInvalidCornerIndex) {
139 if (boundary_corner_to_component_map_[corners[c].value()] == -1) {
140 boundary_corner_to_component_map_[corners[c].value()] =
142 components_[component_id].boundary_edges.push_back(
148 const int opp_face_id = corner_table->Face(opp_corner).value();
149 if (is_face_visited[opp_face_id]) {
152 is_face_visited[opp_face_id] =
true;
153 face_stack.push_back(opp_face_id);