diff --git a/main.py b/main.py index 7699bf4..3c2967a 100644 --- a/main.py +++ b/main.py @@ -89,48 +89,56 @@ class MAPS(obja.Model): self.faces[i] = Face(face.a, face.b, face.c) def update(self): - self.update_edges() self.update_rings() + self.update_edges() self.update_normals() self.update_area_curvature() def update_edges(self): self.edges = {} - remaining_faces = self.faces.copy() - while None in remaining_faces: - remaining_faces.remove(None) - for face in track(self.faces, description='Update edges'): if face is None: continue for a, b in sliding_window([face.a, face.b, face.c], n=2): new_edge = Edge(a, b) - if self.edges.get(f"{new_edge.a}:{new_edge.b}") is None: + if f"{new_edge.a}:{new_edge.b}" not in self.edges.keys(): new_edge.face1 = face - if face in remaining_faces: - remaining_faces.remove(face) + for face2_i in self.vertices[new_edge.a].face_ring: + face2 = self.faces[face2_i] + if face2 == face: + continue - for face2 in remaining_faces: face2_vertices = (face2.a, face2.b, face2.c) if not (a in face2_vertices and b in face2_vertices): continue + new_edge.face2 = face2 break - if new_edge.face2 is None: - print('ooooooooooooooooooooooo') + self.edges[f"{new_edge.a}:{new_edge.b}"] = new_edge def update_rings(self): - for i, vertex in enumerate(self.vertices): + for vertex in self.vertices: if vertex is None: continue + vertex.face_ring = [] - vertex_ring, face_ring = self.one_ring(i) - vertex.vertex_ring = vertex_ring - vertex.face_ring = face_ring + for face_i in track(range(len(self.faces)), description='Finding rings'): + face = self.faces[face_i] + if face is None: + continue + for vertex_i in (face.a, face.b, face.c): + self.vertices[vertex_i].face_ring.append(face_i) + + for vertex_i in track(range(len(self.vertices)), description='Truc'): + vertex = self.vertices[vertex_i] + if vertex is None: + continue + ring = self.one_ring(vertex_i) + vertex.vertex_ring = ring def update_area_curvature(self): for i, vertex in enumerate(self.vertices): @@ -175,7 +183,7 @@ class MAPS(obja.Model): if norm != 0: vertex.normal /= norm - def one_ring(self, index: int) -> tuple[list[int], list[int]]: + def one_ring(self, index: int) -> list[int]: """ Return the corresponding 1-ring Args: @@ -187,15 +195,7 @@ class MAPS(obja.Model): if self.vertices[index] is None: return None, None - # Find the 1-ring faces - ring_faces, ring_face_indices = [], [] - for face_index, face in enumerate(self.faces): - if face is None: - continue - - if index in (face.a, face.b, face.c): - ring_faces.append(face) - ring_face_indices.append(face_index) + ring_faces = [self.faces[i] for i in self.vertices[index].face_ring] # Initialize the ring start_index = (ring_faces[0].a if ring_faces[0].a != index and ring_faces[0].c != index else @@ -225,7 +225,7 @@ class MAPS(obja.Model): raise ValueError( f"Vertex {prev_index} is not in the remaining faces {ring_faces}. Origin {ring} on {index}") - return ring, ring_face_indices + return ring def compute_area_curvature(self, index: int) -> tuple[float, float]: """ Compute area and curvature the corresponding 1-ring