mightyscape-1.2/extensions/fablabchemnitz/starshine/starshine.py

106 lines
3.1 KiB
Python

#!/usr/bin/env python3
#
# Copyright (C) 2021 Stefan Benediktsson
#
# GNU Affero General Public License v3.0
# Permissions of this strongest copyleft license are
# conditioned on making available complete source code
# of licensed works and modifications, which include
# larger works using a licensed work, under the same
# license. Copyright and license notices must be preserved.
# Contributors provide an express grant of patent rights.
# When a modified version is used to provide a service
# over a network, the complete source code of the modified
# version must be made available.
#
"""
Generate a Starshine as SVG.
"""
import random
from math import acos, cos, radians, sin, sqrt, tan
import inkex
def points_to_svgd(p):
"""
p: list of 2 tuples (x, y coordinates)
"""
f = p[0]
p = p[1:]
svgd = 'M{:.3f},{:.3f}'.format(f[0], f[1])
for x in p:
svgd += 'L{:.3f},{:.3f}'.format(x[0], x[1])
svgd +='Z'
return svgd
def checkSize(a, b):
if a >= b:
return b, a
else:
return a, b
class Starshine(inkex.GenerateExtension):
container_label = 'Rendered Starshine'
def add_arguments(self, pars):
pars.add_argument("--r1", type=int, default=20, help="Inner Radius min")
pars.add_argument("--r2", type=int, default=20, help="Inner Radius max")
pars.add_argument("--R1", type=int, default=350, help="Outer Radius min")
pars.add_argument("--R2", type=int, default=350, help="Outer Radius min")
pars.add_argument("--a1", type=int, default=5, help="Angle min")
pars.add_argument("--a2", type=int, default=7, help="Angle max")
def generate(self):
r1 = self.options.r1
r2 = self.options.r2
R1 = self.options.R1
R2 = self.options.R2
a1 = self.options.a1
a2 = self.options.a2
# generate points: list of (x, y) pairs
r1, r2 = checkSize(r1, r2)
R1, R2 = checkSize(R1, R2)
a1, a2 = checkSize(a1, a2)
a = 0
style = {'stroke': '#000000', 'fill': '#000000', 'stroke-width': str(self.svg.unittouu('1px'))}
points = []
while a < 360:
dI = random.randint(r1,r2)
dO = random.randint(R1,R2)
ad = random.randint(a1,a2)
x00 = cos(radians(a)) * dI
y00 = sin(radians(a)) * dI
x10 = cos(radians(a+ad/2)) * dO
y10 = sin(radians(a+ad/2)) * dO
x01 = cos(radians(a+ad)) * dI
y01 = sin(radians(a+ad)) * dI
points.append((x00, y00))
points.append((x10, y10))
points.append((x01, y01))
a = a+ad
path = points_to_svgd(points)
yield inkex.PathElement(style=str(inkex.Style(style)), d=str(path))
if __name__ == '__main__':
Starshine().run()