feat: faster
This commit is contained in:
parent
0c79065d11
commit
dff7ae111e
52
main.py
52
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
|
||||
|
|
Loading…
Reference in a new issue