The following will render an SVG resembling a zig-zag sewing stitch, using python:
import pysvg.structure
import pysvg.builders
import pysvg.text
import math
import numpy as np
from IPython.core.display import SVG
svg_document = pysvg.structure.Svg()
shape_builder = pysvg.builders.ShapeBuilder()
style = pysvg.builders.StyleBuilder()
style.setStrokeWidth(2)
style.setStroke('black')
def complete(doc, file):
doc.save(file)
def line(a, b):
if (a == None):
return
if (b == None):
return
(x1, y1) = a
(x2, y2) = b
# allows for textures that return where they start
if (x1 == x2 and y1 == y2):
return
line = shape_builder.createLine(x1, y1, x2, y2, style)
svg_document.addElement(line)
patternPattern = [(0, 0), (0.3, 1), (0.6, 0)]
patternScale = (3, 20)
(pxScale, pyScale) = patternScale
pattern = [(x * pxScale, y * pyScale) for (x, y) in patternPattern]
def width(p):
return \
max([x for (x, y) in p]) - \
min([x for (x, y) in p])
def height(p):
return \
max([y for (x, y) in p]) - \
min([y for (x, y) in p])
def minus(p1, p2):
(x1, y1) = p1
(x2, y2) = p2
return (x2 - x1, y2 - y2)
def perpendicular(v1):
rotation = np.matrix(1 )
return rotation * v1
resolution = 1000.0
# todo not really right...
points = int(round(resolution / width(pattern)))
width = 100.0
height = 100.0
patternIdx = 0
actualPre = None
pathPre = None
for index in xrange(points):
gridPos = index * resolution / points
(patternX, patternY) = pattern[patternIdx]
fn = math.sin
pathX = gridPos
pathY = height + height / 4 * fn(gridPos / 20.0)
pathPoint = np.array( (pathX, pathY) )
if (pathPre <> None):
delta = pathPoint - pathPre
actualPoint = \
(patternX + pathX, \
patternY + pathY)
line(actualPre, actualPoint)
patternIdx = (patternIdx + 1) % len(pattern)
actualPre = actualPoint
pathPre = pathPoint
complete(svg_document, "test.svg")
SVG("test.svg")
- 0, -1), (1, 0 [↩]