Use to_polygons() for bounds calculation for simple path shapes

lethe/HEAD
jan 5 years ago
parent 2c9af3f63f
commit dcd8324eb4

@ -2,7 +2,7 @@ from typing import List, Tuple, Dict
import copy import copy
from enum import Enum from enum import Enum
import numpy import numpy
from numpy import pi from numpy import pi, inf
from . import Shape, normalized_shape_tuple, Polygon, Circle from . import Shape, normalized_shape_tuple, Polygon, Circle
from .. import PatternError from .. import PatternError
@ -299,18 +299,12 @@ class Path(Shape):
elif self.cap in (Path.Cap.Flush, elif self.cap in (Path.Cap.Flush,
Path.Cap.Square, Path.Cap.Square,
Path.Cap.SquareCustom): Path.Cap.SquareCustom):
extensions = self._calculate_cap_extensions() bounds = numpy.array([[+inf, +inf], [-inf, -inf]])
polys = self.to_polygons()
v = remove_colinear_vertices(self.vertices, closed_path=False) for poly in polys:
dv = numpy.diff(v, axis=0) poly_bounds = poly.get_bounds()
dvdir = dv / numpy.sqrt((dv * dv).sum(axis=1))[:, None] bounds[0, :] = numpy.minimum(bounds[0, :], poly_bounds[0, :])
perp = dvdir[:, ::-1] * [[1, -1]] * self.width / 2 bounds[1, :] = numpy.maximum(bounds[1, :], poly_bounds[1, :])
v[0] -= dvdir * extensions[0]
v[-1] += dvdir * extensions[1]
bounds = self.offset + numpy.vstack((numpy.min(v - numpy.abs(perp), axis=0),
numpy.max(v + numpy.abs(perp), axis=0)))
else: else:
raise PatternError('get_bounds() not implemented for endcaps: {}'.format(self.cap)) raise PatternError('get_bounds() not implemented for endcaps: {}'.format(self.cap))

Loading…
Cancel
Save