Skip to content

Commit e773ae5

Browse files
committed
cdt using cgal
1 parent 648edb3 commit e773ae5

File tree

10 files changed

+520
-124
lines changed

10 files changed

+520
-124
lines changed

docs/examples/triangulation.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import numpy as np
2+
3+
from compas_plotters import Plotter
4+
from compas.geometry import Polygon, Translation
5+
from compas.datastructures import Mesh
6+
from compas_cgal.triangulation import constrained_delaunay_triangulation
7+
8+
9+
boundary = Polygon.from_sides_and_radius_xy(4, 10)
10+
boundary = np.array(boundary, dtype=np.float64)
11+
12+
hole = Polygon.from_sides_and_radius_xy(8, 2)
13+
14+
hole1 = hole.transformed(Translation.from_vector([4, 0, 0]))
15+
hole2 = hole.transformed(Translation.from_vector([-4, 0, 0]))
16+
hole3 = hole.transformed(Translation.from_vector([0, 4, 0]))
17+
hole4 = hole.transformed(Translation.from_vector([0, -4, 0]))
18+
19+
V, F = constrained_delaunay_triangulation(boundary, [hole1, hole2, hole3, hole4], [], maxlength=1.0)
20+
21+
mesh = Mesh.from_vertices_and_faces(V, F)
22+
23+
plotter = Plotter(figsize=(8, 8))
24+
plotter.add(mesh, sizepolicy='absolute', vertexsize=5)
25+
plotter.zoom_extents()
26+
plotter.show()

docs/examples/triangulation.rst

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
********************************************************************************
2+
Triangulation
3+
********************************************************************************
4+
5+
.. figure:: /_images/cgal_triangulation.png
6+
:figclass: figure
7+
:class: figure-img img-fluid
8+
9+
10+
.. literalinclude:: triangulation.py
11+
:language: python

scripts/cdt.py

Lines changed: 0 additions & 21 deletions
This file was deleted.

setup.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,11 @@ def get_library_dirs():
5555
sorted([
5656
'src/compas_cgal.cpp',
5757
'src/compas.cpp',
58-
# 'src/meshing.cpp',
59-
# 'src/booleans.cpp',
60-
# 'src/slicer.cpp',
61-
# 'src/intersections.cpp',
62-
# 'src/measure.cpp',
58+
'src/meshing.cpp',
59+
'src/booleans.cpp',
60+
'src/slicer.cpp',
61+
'src/intersections.cpp',
62+
'src/measure.cpp',
6363
'src/triangulations.cpp',
6464
]),
6565
include_dirs=[

src/compas_cgal.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33

44
namespace py = pybind11;
55

6-
// void init_meshing(py::module&);
7-
// void init_booleans(py::module&);
8-
// void init_slicer(py::module&);
9-
// void init_intersections(py::module&);
10-
// void init_measure(py::module&);
6+
void init_meshing(py::module&);
7+
void init_booleans(py::module&);
8+
void init_slicer(py::module&);
9+
void init_intersections(py::module&);
10+
void init_measure(py::module&);
1111
void init_triangulations(py::module&);
1212

1313
PYBIND11_MODULE(_cgal, m) {
@@ -17,10 +17,10 @@ PYBIND11_MODULE(_cgal, m) {
1717
.def_readonly("vertices", &compas::Result::vertices)
1818
.def_readonly("faces", &compas::Result::faces);
1919

20-
// init_meshing(m);
21-
// init_booleans(m);
22-
// init_slicer(m);
23-
// init_intersections(m);
24-
// init_measure(m);
20+
init_meshing(m);
21+
init_booleans(m);
22+
init_slicer(m);
23+
init_intersections(m);
24+
init_measure(m);
2525
init_triangulations(m);
2626
}

src/compas_cgal/__init__.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,15 @@
6464
6565
slicer.slice_mesh
6666
67+
Slicer
68+
------
69+
70+
.. autosummary::
71+
:toctree: generated/
72+
:nosignatures:
73+
74+
triangulation.constrained_delaunay_triangulation
75+
6776
"""
6877
from __future__ import print_function
6978

src/compas_cgal/triangulation.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import numpy as np
2+
from compas_cgal._cgal import triangulations
3+
4+
5+
def constrained_delaunay_triangulation(boundary, holes=None, curves=None, maxlength=None):
6+
"""Construct a constrained Delaunay triangulation.
7+
8+
Parameters
9+
----------
10+
boundary : :class:`compas.geometry.Polygon`
11+
The boundary of the triangulation.
12+
holes : list of :class:`compas.geometry.Polygon`, optional
13+
Internal boundary polygons.
14+
curves : list of :class:`compas.geometry.Polyline`, optional
15+
Internal constraint curves.
16+
maxlength : float, optional
17+
The maximum length of the triangle edges.
18+
19+
Returns
20+
-------
21+
list
22+
The vertices and faces of the triangulation.
23+
24+
Notes
25+
-----
26+
...
27+
28+
"""
29+
boundary = np.array(boundary, dtype=np.float64)
30+
31+
if holes:
32+
holes = [np.array(hole, dtype=np.float64) for hole in holes]
33+
else:
34+
holes = []
35+
36+
if curves:
37+
curves = [np.array(curve, dtype=np.float64) for curve in curves]
38+
else:
39+
curves = []
40+
41+
maxlength = maxlength or 0.0
42+
43+
return triangulations.constrained_delaunay_triangulation(boundary, holes, curves, maxlength=maxlength)

src/compas_cgal/triangulation.pyi

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
from typing import List
2+
from typing import Optional
3+
4+
from compas.geometry import Polygon
5+
from compas.geometry import Polyline
6+
7+
from compas_cgal.types import VerticesFacesNumpy
8+
9+
10+
def constrained_delaunay_triangulation(boundary: Polygon,
11+
holes: Optional[List[Polygon]] = None,
12+
curves: Optional[List[Polyline]] = None,
13+
maxlength: Optional[float] = None) -> VerticesFacesNumpy: ...

0 commit comments

Comments
 (0)