Skip to content

Instantly share code, notes, and snippets.

@vegard
Last active December 1, 2016 22:39
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vegard/929a74bbfe862c7a1e0f61e4d2bbceb0 to your computer and use it in GitHub Desktop.
Save vegard/929a74bbfe862c7a1e0f61e4d2bbceb0 to your computer and use it in GitHub Desktop.
import math
import os
import sys
import PIL
import PIL.Image
import cairo
WIDTH, HEIGHT = 512, 512
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, WIDTH, HEIGHT)
ctx = cairo.Context(surface)
ctx.scale(WIDTH, HEIGHT)
ims = []
nr_frames = 30
nr_triangles = 90
p0 = (.5 + .4 * math.cos(0 * 120 * math.pi / 180.), .5 + .4 * math.sin(0 * 120 * math.pi / 180.))
p1 = (.5 + .4 * math.cos(1 * 120 * math.pi / 180.), .5 + .4 * math.sin(1 * 120 * math.pi / 180.))
p2 = (.5 + .4 * math.cos(2 * 120 * math.pi / 180.), .5 + .4 * math.sin(2 * 120 * math.pi / 180.))
def circle(c, r, a):
x = c[0] + r * math.cos(a * math.pi / 180.)
y = c[1] + r * math.sin(a * math.pi / 180.)
return (x, y)
def linear(a, b, t):
ti = 1 - t
x = a[0] * t + b[0] * ti
y = a[1] * t + b[1] * ti
return (x, y)
def add(a, b):
x = a[0] + b[0]
y = a[1] + b[1]
return (x, y)
for frame in range(nr_frames):
ctx.set_source_rgb(1, 1, 1)
ctx.rectangle(0, 0, 1, 1)
ctx.fill()
def draw_triangle(c, a):
r = .1
ctx.move_to(*circle(c, r, a + 0 * 120))
ctx.line_to(*circle(c, r, a + 1 * 120))
ctx.line_to(*circle(c, r, a + 2 * 120))
ctx.close_path()
for i in range(nr_triangles):
t = 1. * i / nr_triangles
c1 = circle((.5, .5), .3, 360. * t)
draw_triangle(c1, 15 * math.sin(3 * math.pi * i / nr_frames) + frame * (120. / nr_frames))
#ctx.set_source_rgba(0, 0, 0, math.sin(1. * i * math.pi / nr_triangles))
ctx.set_source_rgb(0, 0, 0)
ctx.set_line_width(0.003)
ctx.stroke()
data = surface.get_data()[:]
im = PIL.Image.frombuffer('RGBA', (WIDTH, HEIGHT), data, 'raw', 'RGBA', 0, 1)
ims.append(im)
ims[0].save('example.gif', save_all=True, append_images=list(ims[1:]), loop=0, duration=30)
@vegard
Copy link
Author

vegard commented Dec 1, 2016

Requires Cairo and Pillow 3.4.0...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment