Source code for compas_slicer.post_processing.simplify_paths_rdp
import rdp as rdp
import numpy as np
import logging
import progressbar
from compas.geometry import Point
# from compas_slicer.geometry import PrintPoint, Contour
logger = logging.getLogger('logger')
__all__ = ['simplify_paths_rdp']
[docs]def simplify_paths_rdp(slicer, threshold):
"""Simplifies a path using the Ramer–Douglas–Peucker algorithm, implemented in the rdp python library.
https://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm
Parameters
----------
slicer: :class:`compas_slicer.slicers.BaseSlicer`
An instance of one of the compas_slicer.slicers classes.
threshold: float
Controls the degree of polyline simplification.
Low threshold removes few points, high threshold removes many points.
"""
logger.info("Paths simplification rdp")
remaining_pts_num = 0
with progressbar.ProgressBar(max_value=len(slicer.layers)) as bar:
for i, layer in enumerate(slicer.layers):
if not layer.is_raft: # no simplification necessary for raft layer
for path in layer.paths:
pts_rdp = rdp.rdp(np.array(path.points), epsilon=threshold)
path.points = [Point(pt[0], pt[1], pt[2]) for pt in pts_rdp]
remaining_pts_num += len(path.points)
bar.update(i)
logger.info('%d Points remaining after rdp simplification' % remaining_pts_num)
if __name__ == "__main__":
pass