diff options
| author | Kaalleen <36401965+kaalleen@users.noreply.github.com> | 2024-01-28 08:48:44 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-01-28 08:48:44 +0100 |
| commit | 92ac7986937c14b224a24aa483d668557ee8ba53 (patch) | |
| tree | 00b306678e1523021f037e09dc4e1798f09e3d03 /lib/stitches | |
| parent | 33b0cdab9e6b7f94e42bd4c2ee13ef8dc5a9f549 (diff) | |
add zigzag option to meander (#2699)
Diffstat (limited to 'lib/stitches')
| -rw-r--r-- | lib/stitches/meander_fill.py | 8 | ||||
| -rw-r--r-- | lib/stitches/running_stitch.py | 28 |
2 files changed, 33 insertions, 3 deletions
diff --git a/lib/stitches/meander_fill.py b/lib/stitches/meander_fill.py index c1308bf4..16510dde 100644 --- a/lib/stitches/meander_fill.py +++ b/lib/stitches/meander_fill.py @@ -14,7 +14,7 @@ from ..utils.list import poprandom from ..utils.prng import iter_uniform_floats from ..utils.smoothing import smooth_path from ..utils.threading import check_stop_flag -from .running_stitch import bean_stitch, running_stitch +from .running_stitch import bean_stitch, running_stitch, zigzag_stitch def meander_fill(fill, shape, original_shape, shape_index, starting_point, ending_point): @@ -178,7 +178,11 @@ def post_process(points, shape, original_shape, fill): smoothed_points = smooth_path(points, fill.smoothness) smoothed_points = [InkStitchPoint.from_tuple(point) for point in smoothed_points] - stitches = running_stitch(smoothed_points, fill.running_stitch_length, fill.running_stitch_tolerance) + if fill.zigzag_spacing > 0: + stitches = running_stitch(smoothed_points, fill.zigzag_spacing / 2, fill.running_stitch_tolerance) + stitches = zigzag_stitch(stitches, fill.zigzag_spacing, fill.zigzag_width, 0) + else: + stitches = running_stitch(smoothed_points, fill.running_stitch_length, fill.running_stitch_tolerance) if fill.clip: stitches = clamp_path_to_polygon(stitches, original_shape) diff --git a/lib/stitches/running_stitch.py b/lib/stitches/running_stitch.py index 6c6a4d1d..139a2006 100644 --- a/lib/stitches/running_stitch.py +++ b/lib/stitches/running_stitch.py @@ -4,9 +4,9 @@ # Licensed under the GNU GPL version 3.0 or later. See the file LICENSE for details. import math -from math import tau import typing from copy import copy +from math import tau import numpy as np from shapely import geometry as shgeo @@ -310,3 +310,29 @@ def bean_stitch(stitches, repeats, tags_to_ignore=None): new_stitches.extend(copy(new_stitches[-2:])) return new_stitches + + +def zigzag_stitch(stitches, zigzag_spacing, stroke_width, pull_compensation): + # Move the points left and right. Consider each pair + # of points in turn, and move perpendicular to them, + # alternating left and right. + + stroke_width = stroke_width + pull_compensation + offset = stroke_width / 2.0 + + for i in range(len(stitches) - 1): + start = stitches[i] + end = stitches[i + 1] + # sometimes the stitch results into zero length which cause a division by zero error + # ignoring this leads to a slightly bad result, but that is better than no output + if (end - start).length() == 0: + continue + segment_direction = (end - start).unit() + zigzag_direction = segment_direction.rotate_left() + + if i % 2 == 1: + zigzag_direction *= -1 + + stitches[i] += zigzag_direction * offset + + return stitches |
