Skip to content

Commit 80950ae

Browse files
authored
Merge pull request #1013 from compas-dev/to_vertices_and_faces_triangulated
Add triangulated flag to Mesh.to_vertices_and_faces
2 parents 636f501 + d617fb8 commit 80950ae

File tree

4 files changed

+54
-3
lines changed

4 files changed

+54
-3
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
99

1010
### Added
1111

12+
* Added optional `triangulated` flag to `Mesh.to_vertices_and_faces`.
13+
1214
### Changed
1315

1416
* Fixed bug in Blender mesh conversion.

src/compas/datastructures/mesh/mesh.py

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -473,9 +473,14 @@ def from_vertices_and_faces(cls, vertices, faces):
473473

474474
return mesh
475475

476-
def to_vertices_and_faces(self):
476+
def to_vertices_and_faces(self, triangulated=False):
477477
"""Return the vertices and faces of a mesh.
478478
479+
Parameters
480+
----------
481+
triangulated: bool, optional
482+
If True, triangulate the faces.
483+
479484
Returns
480485
-------
481486
list[list[float]]
@@ -486,7 +491,31 @@ def to_vertices_and_faces(self):
486491
"""
487492
key_index = self.key_index()
488493
vertices = [self.vertex_coordinates(key) for key in self.vertices()]
489-
faces = [[key_index[key] for key in self.face_vertices(fkey)] for fkey in self.faces()]
494+
495+
if not triangulated:
496+
faces = [[key_index[key] for key in self.face_vertices(fkey)] for fkey in self.faces()]
497+
return vertices, faces
498+
499+
faces = []
500+
501+
for fkey in self.faces():
502+
face_vertices = self.face_vertices(fkey)
503+
504+
if len(face_vertices) == 3:
505+
a, b, c = face_vertices
506+
faces.append([key_index[a], key_index[b], key_index[c]])
507+
elif len(face_vertices) == 4:
508+
a, b, c, d = face_vertices
509+
faces.append([key_index[a], key_index[b], key_index[c]])
510+
faces.append([key_index[a], key_index[c], key_index[d]])
511+
else:
512+
centroid = centroid_polygon([vertices[key_index[key]] for key in face_vertices])
513+
ckey = len(vertices)
514+
vertices.append(centroid)
515+
516+
for a, b in pairwise(face_vertices + face_vertices[:1]):
517+
faces.append([key_index[a], key_index[b], ckey])
518+
490519
return vertices, faces
491520

492521
@classmethod

src/compas/geometry/shapes/_shape.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ class Shape(Geometry):
1010
"""Base class for geometric shapes."""
1111

1212
@abc.abstractmethod
13-
def to_vertices_and_faces(self):
13+
def to_vertices_and_faces(self, triangulated=False):
1414
pass
1515

1616
def __add__(self, other):

tests/compas/datastructures/test_mesh.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from compas.datastructures import meshes_join_and_weld
88
from compas.geometry import Box
99
from compas.geometry import Polygon
10+
from compas.geometry import Polyhedron
1011
from compas.geometry import Translation
1112
from compas.geometry import allclose
1213

@@ -183,6 +184,25 @@ def test_to_vertices_and_faces():
183184
assert len(faces) == 25
184185

185186

187+
def test_to_vertices_and_faces_triangulated():
188+
# tri
189+
mesh = Mesh.from_shape(Polyhedron.from_platonicsolid(4))
190+
vertices, faces = mesh.to_vertices_and_faces(triangulated=True)
191+
assert len(vertices) == 4
192+
assert len(faces) == 4
193+
194+
# quad
195+
mesh = Mesh.from_shape(Polyhedron.from_platonicsolid(6))
196+
vertices, faces = mesh.to_vertices_and_faces(triangulated=True)
197+
assert len(vertices) == 8
198+
assert len(faces) == 12
199+
200+
# ngon
201+
mesh = Mesh.from_shape(Polyhedron.from_platonicsolid(12))
202+
vertices, faces = mesh.to_vertices_and_faces(triangulated=True)
203+
assert len(vertices) == 32
204+
assert len(faces) == 60
205+
186206
# --------------------------------------------------------------------------
187207
# helpers
188208
# --------------------------------------------------------------------------

0 commit comments

Comments
 (0)