feat: faster

This commit is contained in:
gdamms 2022-10-17 16:27:49 +02:00
parent 0c79065d11
commit dff7ae111e

52
main.py
View file

@ -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