snapshot 2019-04-20 00:34:56.695516
This commit is contained in:
commit
9f14efb647
@ -284,49 +284,54 @@ def read(filename: str,
|
||||
if element.width == 0:
|
||||
continue
|
||||
|
||||
#TODO add extension
|
||||
v = remove_colinear_vertices(numpy.array(element.xy, dtype=float), closed_path=False)
|
||||
dv = numpy.diff(v, axis=0)
|
||||
dvdir = dv / numpy.sqrt((dv * dv).sum(axis=1))[:, None]
|
||||
perp = dvdir[:, ::-1] * [[1, -1]] * element.width / 2
|
||||
|
||||
# add extension
|
||||
v[0] -= dvdir[0] * extension
|
||||
v[-1] += dvdir[-1] * extension
|
||||
perp = dvdir[:, ::-1] * [1, -1] * element.width / 2
|
||||
|
||||
# Find intersections of expanded sides
|
||||
As = numpy.stack((dv[:-1], -dv[1:]), axis=2)
|
||||
bs = v[1:-1] - v[:-2] + perp[1:] - perp[:-1]
|
||||
ds = v[1:-1] - v[:-2] - perp[1:] + perp[:-1]
|
||||
|
||||
rp = numpy.linalg.solve(As, bs)[:, 0, None]
|
||||
rn = numpy.linalg.solve(As, ds)[:, 0, None]
|
||||
|
||||
print(rp)
|
||||
|
||||
intersection_p = v[:-2] + rp * dv[:-1] + perp[:-1]
|
||||
intersection_n = v[:-2] + rn * dv[:-1] - perp[:-1]
|
||||
|
||||
towards_perp = (dv[1:] * perp[:-1]).sum(axis=1) > 0 # path bends towards previous perp?
|
||||
# straight = (dv[1:] * perp[:-1]).sum(axis=1) == 0 # path is straight
|
||||
acute = (dv[1:] * dv[:-1]).sum(axis=1) < 0 # angle is acute?
|
||||
|
||||
|
||||
o0 = [v[0] + perp[0]]
|
||||
o1 = [v[0] - perp[0]]
|
||||
|
||||
for i in range(1, dv.shape[0]):
|
||||
towards_perp = numpy.dot(perp[i - 1], dv[i]) > 0 # bends towards previous perp
|
||||
#straight = numpy.dot(perp[i - 1], dv[i]) == 0 # TODO maybe run without cleaning?
|
||||
acute = numpy.dot(dv[i - 1], dv[i]) < 0
|
||||
|
||||
A = numpy.column_stack((dv[i - 1], -dv[i]))
|
||||
ab = numpy.linalg.solve(A, v[i] + perp[i] - v[i - 1] - perp[i - 1])
|
||||
cd = numpy.linalg.solve(A, v[i] - perp[i] - v[i - 1] + perp[i - 1])
|
||||
perpside_intersection = v[i - 1] + ab[0] * dv[i - 1] + perp[i - 1]
|
||||
otherside_intersection = v[i - 1] + cd[0] * dv[i - 1] - perp[i - 1]
|
||||
if towards_perp:
|
||||
o0.append(perpside_intersection)
|
||||
if acute:
|
||||
# Opposite is 180 > angle > 270
|
||||
o1.append(otherside_intersection)
|
||||
for i in range(dv.shape[0] - 1):
|
||||
if towards_perp[i]:
|
||||
o0.append(intersection_p[i])
|
||||
if acute[i]:
|
||||
o1.append(intersection_n[i])
|
||||
else:
|
||||
# Opposite is >270
|
||||
pt0 = v[i] - perp[i - 1] + dvdir[i - 1] * element.width / 2
|
||||
pt1 = v[i] - perp[i] - dvdir[i] * element.width / 2
|
||||
pt0 = v[i + 1] - perp[i + 0] + dvdir[i + 0] * element.width / 2
|
||||
pt1 = v[i + 1] - perp[i + 1] - dvdir[i + 1] * element.width / 2
|
||||
o1 += [pt0, pt1]
|
||||
else:
|
||||
# > 180, opposite is <180
|
||||
o1.append(otherside_intersection)
|
||||
print('oi', otherside_intersection)
|
||||
if acute:
|
||||
# > 270, opposite is <90
|
||||
pt0 = v[i] + perp[i - 1] + dvdir[i - 1] * element.width / 2
|
||||
pt1 = v[i] + perp[i] - dvdir[i] * element.width / 2
|
||||
o1.append(intersection_n[i])
|
||||
if acute[i]:
|
||||
# > 270
|
||||
pt0 = v[i + 1] + perp[i + 0] + dvdir[i + 0] * element.width / 2
|
||||
pt1 = v[i + 1] + perp[i + 1] - dvdir[i + 1] * element.width / 2
|
||||
o0 += [pt0, pt1]
|
||||
else:
|
||||
# 180 > angle >270
|
||||
o0.append(perpside_intersection)
|
||||
o0.append(intersection_p[i])
|
||||
o0.append(v[-1] + perp[-1])
|
||||
o1.append(v[-1] - perp[-1])
|
||||
verts = numpy.vstack((o0, o1[::-1]))
|
||||
|
Loading…
x
Reference in New Issue
Block a user