Skip to content

Instantly share code, notes, and snippets.

@lexbailey
Created November 26, 2020 14:19
Show Gist options
  • Select an option

  • Save lexbailey/a3f96930193e36c8cad92cb248f4b0d2 to your computer and use it in GitHub Desktop.

Select an option

Save lexbailey/a3f96930193e36c8cad92cb248f4b0d2 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python3
import svgwrite
import random
from scipy.spatial import Voronoi
import numpy as np
import math
random.seed(4)
size = (1920, 1080)
dwg = svgwrite.Drawing('test.svg', size=size)
points = [
(int(random.random()*size[0]*2)-(size[0]/2)
,(int(random.random()*size[1]*2))-(size[1]/2))
for i in range(50)
]
vp = Voronoi(points);
for p in vp.vertices:
dwg.add(dwg.circle(tuple(p), stroke=svgwrite.rgb(128, 10, 16, '%'), style='stroke-width:1px'))
def vsub(a, b):
return (a[0]-b[0], a[1]-b[1])
def hsv_to_rgb(h, s, v):
if s == 0.0: return (v, v, v)
i = int(h*6.)
f = (h*6.)-i; p,q,t = v*(1.-s), v*(1.-s*f), v*(1.-s*(1.-f)); i%=6
if i == 0: return (v, t, p)
if i == 1: return (q, v, p)
if i == 2: return (p, v, t)
if i == 3: return (p, q, v)
if i == 4: return (t, p, v)
if i == 5: return (v, p, q)
def vmul(a, s):
return (
a[0] *s
,a[1] *s
,a[2] *s
)
for r in vp.regions:
if not r:
continue
if -1 in r:
continue
r_points = [tuple(vp.vertices[i]) for i in r]
n = int(random.random()*len(r_points))
r_points = [*r_points[n:None], *r_points[0:n]]
dwg.add(dwg.polygon(points=r_points, stroke=svgwrite.rgb(1, 100, 16, '%'), style='stroke-width:1px'))
for i in range(1, len(r_points)-1):
tri = [
r_points[0]
,r_points[i]
,r_points[i+1]
]
vector_1 = np.array(vsub(tri[1], tri[0]))
vector_2 = np.array(vsub(tri[2], tri[0]))
unit_vector_1 = vector_1 / np.linalg.norm(vector_1)
unit_vector_2 = vector_2 / np.linalg.norm(vector_2)
dot_product = np.dot(unit_vector_1, unit_vector_2)
angle = np.arccos(dot_product) * (180/math.pi)
dwg.add(dwg.polygon(points=tri, fill=svgwrite.rgb(*vmul(hsv_to_rgb(angle, 1, 1), 256), '%'), stroke=svgwrite.rgb(128, 10, 16, '%'), style='stroke-width:1px'))
for p in points:
dwg.add(dwg.circle(p, stroke=svgwrite.rgb(10, 10, 16, '%'), style='stroke-width:10px'))
dwg.save()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment