in src/python/phyre/virtual_tools.py [0:0]
def segs2poly(seglist, r):
vlist = [np.array(v) for v in seglist]
# Start by figuring out the initial edge (ensure ccw winding)
iseg = vlist[1] - vlist[0]
ipt = vlist[0]
iang = np.arctan2(iseg[1], iseg[0])
if iang <= (-np.pi / 4.) and iang >= (-np.pi * 3. / 4.):
# Going downwards
prev1 = (ipt[0] - r, ipt[1])
prev2 = (ipt[0] + r, ipt[1])
elif iang >= (np.pi / 4.) and iang <= (np.pi * 3. / 4.):
# Going upwards
prev1 = (ipt[0] + r, ipt[1])
prev2 = (ipt[0] - r, ipt[1])
elif iang >= (-np.pi / 4.) and iang <= (np.pi / 4.):
# Going rightwards
prev1 = (ipt[0], ipt[1] - r)
prev2 = (ipt[0], ipt[1] + r)
else:
# Going leftwards
prev1 = (ipt[0], ipt[1] + r)
prev2 = (ipt[0], ipt[1] - r)
polylist = []
for i in range(1, len(vlist) - 1):
pi = vlist[i]
pim = vlist[i - 1]
pip = vlist[i + 1]
sm = pim - pi
sp = pip - pi
# Get the angle of intersection between two lines
angm = np.arctan2(sm[1], sm[0]) #.angle
angp = np.arctan2(sp[1], sp[0]) #.angle
angi = (angm - angp) % (2 * np.pi)
# Find the midpoint of this angle and turn it back into a unit vector
angn = (angp + (angi / 2.)) % (2 * np.pi)
if angn < 0:
angn += 2 * np.pi
#unitn = np.array([1.0, 0.0])#pm.Vec2d.unit()
unitn = np.array([np.cos(angn), np.sin(angn)])
#unitn.angle = angn
xdiff = r if unitn[0] >= 0 else -r
ydiff = r if unitn[1] >= 0 else -r
next3 = (pi[0] + xdiff, pi[1] + ydiff)
next4 = (pi[0] - xdiff, pi[1] - ydiff)
# Ensure appropriate winding -- next3 should be on the left of next4
if _isleft(prev2, next3, next4):
tmp = next4
next4 = next3
next3 = tmp
curr_poly = [prev1, prev2, next3, next4]
curr_poly.reverse()
polylist.append(curr_poly)
prev1 = next4
prev2 = next3
# Finish by figuring out the final edge
fseg = vlist[-2] - vlist[-1]
fpt = vlist[-1]
fang = np.arctan2(fseg[1], fseg[0]) #.angle
if fang <= (-np.pi / 4.) and fang >= (-np.pi * 3. / 4.):
# Coming from downwards
next3 = (fpt[0] - r, fpt[1])
next4 = (fpt[0] + r, fpt[1])
elif fang >= (np.pi / 4.) and fang <= (np.pi * 3. / 4.):
# Coming from upwards
next3 = (fpt[0] + r, fpt[1])
next4 = (fpt[0] - r, fpt[1])
elif fang >= (-np.pi / 4.) and fang <= (np.pi / 4.):
# Coming from rightwards
next3 = (fpt[0], fpt[1] - r)
next4 = (fpt[0], fpt[1] + r)
else:
# Coming from leftwards
next3 = (fpt[0], fpt[1] + r)
next4 = (fpt[0], fpt[1] - r)
curr_poly = [prev1, prev2, next3, next4]
curr_poly.reverse()
polylist.append(curr_poly)
return polylist