[Path.to_polygons] Use linalg.solve() where possible; fallback to lstsq if singular
This commit is contained in:
parent
f154303bef
commit
25b8fe8448
1 changed files with 12 additions and 2 deletions
|
|
@ -344,8 +344,18 @@ class Path(Shape):
|
|||
bs = v[1:-1] - v[:-2] + perp[1:] - perp[:-1]
|
||||
ds = v[1:-1] - v[:-2] - perp[1:] + perp[:-1]
|
||||
|
||||
rp = numpy.linalg.lstsq(As, bs[:, :, None], rcond=1e-12)[0][:, 0, 0]
|
||||
rn = numpy.linalg.lstsq(As, ds[:, :, None], rcond=1e-12)[0][:, 0, 0]
|
||||
try:
|
||||
# Vectorized solve for all intersections
|
||||
# solve supports broadcasting: As (N-2, 2, 2), bs (N-2, 2, 1)
|
||||
rp = numpy.linalg.solve(As, bs[:, :, None])[:, 0, 0]
|
||||
rn = numpy.linalg.solve(As, ds[:, :, None])[:, 0, 0]
|
||||
except numpy.linalg.LinAlgError:
|
||||
# Fallback to slower lstsq if some segments are parallel (singular matrix)
|
||||
rp = numpy.zeros(As.shape[0])
|
||||
rn = numpy.zeros(As.shape[0])
|
||||
for ii in range(As.shape[0]):
|
||||
rp[ii] = numpy.linalg.lstsq(As[ii], bs[ii, :, None], rcond=1e-12)[0][0, 0]
|
||||
rn[ii] = numpy.linalg.lstsq(As[ii], ds[ii, :, None], rcond=1e-12)[0][0, 0]
|
||||
|
||||
intersection_p = v[:-2] + rp[:, None] * dv[:-1] + perp[:-1]
|
||||
intersection_n = v[:-2] + rn[:, None] * dv[:-1] - perp[:-1]
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue