use faster algorithm for ties

pull/316/head
Lex Neva 2018-09-15 21:33:44 -04:00
rodzic bdf98a7e91
commit 9b619de228
2 zmienionych plików z 27 dodań i 10 usunięć

Wyświetl plik

@ -2,7 +2,7 @@ from ..utils.geometry import Point
class Stitch(Point):
def __init__(self, x, y, color=None, jump=False, stop=False, trim=False, color_change=False, fake_color_change=False, no_ties=False):
def __init__(self, x, y=None, color=None, jump=False, stop=False, trim=False, color_change=False, fake_color_change=False, no_ties=False):
self.x = x
self.y = y
self.color = color
@ -13,6 +13,12 @@ class Stitch(Point):
self.fake_color_change = fake_color_change
self.no_ties = no_ties
# Allow creating a Stitch from a Point
if isinstance(x, Point):
point = x
self.x = point.x
self.y = point.y
def __repr__(self):
return "Stitch(%s, %s, %s, %s, %s, %s, %s, %s%s)" % (self.x,
self.y,

Wyświetl plik

@ -1,26 +1,37 @@
from copy import deepcopy
from .stitch import Stitch
from ..utils import cut_path
from ..stitches import running_stitch
from ..svg import PIXELS_PER_MM
def add_tie(stitches, tie_path):
if stitches[-1].no_ties:
if len(tie_path) < 2 or stitches[0].no_ties:
# It's from a manual stitch block, so don't add tie stitches. The user
# will add them if they want them.
return
tie_path = cut_path(tie_path, 0.6)
tie_stitches = running_stitch(tie_path, 0.3)
tie_stitches = [Stitch(stitch.x, stitch.y) for stitch in tie_stitches]
to_previous = tie_path[1] - tie_path[0]
length = to_previous.length()
if length > 0.5 * PIXELS_PER_MM:
# Travel back one stitch, stopping halfway there.
# Then go forward one stitch, stopping halfway between
# again.
stitches.extend(deepcopy(tie_stitches[1:]))
stitches.extend(deepcopy(list(reversed(tie_stitches))[1:]))
# but travel at most 1.5mm
length = min(length, 1.5 * PIXELS_PER_MM)
direction = to_previous.unit()
for delta in (0.5, 1.0, 0.5, 0):
stitches.append(Stitch(tie_path[0] + delta * length * direction))
else:
# Too short to travel part of the way to the previous stitch; ust go
# back and forth to it a couple times.
for i in (1, 0, 1, 0):
stitches.append(deepcopy(tie_path[i]))
def add_tie_off(stitches):
add_tie(stitches, list(reversed(stitches)))
add_tie(stitches, stitches[-1:-3:-1])
def add_tie_in(stitches, upcoming_stitches):