# Simple animation showing pixel vs subpixel accuracy.
# by Miloslav Ciz, released under CC0 1.0
from PIL import Image
import math
SCALE = 8
FRAMES = 64
RESOLUTION = (48,16)
img = Image.new("RGB",(RESOLUTION[0] * SCALE,RESOLUTION[1] * SCALE),"white")
pixels = img.load()
def setPixel(x, y, c):
for b in range(SCALE):
for a in range(SCALE):
pixels[x * SCALE + a,y * SCALE + b] = (c,c,c)
def drawLine(p0, p1, aa):
slope = (p1[1] - p0[1]) / float(p1[0] - p0[0])
for i in range(int(p1[0] - p0[0] + 1)):
x = int(p0[0] + i) if aa else round(p0[0] + i)
y = p0[1] + i * slope
c = int(255 * (y % 1)) if aa else 0
y = int(y) if aa else round(y)
setPixel(x,y,c)
if aa:
setPixel(x,y + 1,255 - c)
for f in range(FRAMES):
img.paste((255,255,255),(0,0,img.size[0],img.size[1]))
t = f / float(FRAMES) * math.pi * 2
x0 = 0
x1 = 15
y0 = 8 + math.sin(t) * 5
y1 = 7 + math.cos(t) * 3
drawLine((x0,round(y0)),(x1,round(y1)),False)
drawLine((x0 + RESOLUTION[0] / 3,y0),(x1 + RESOLUTION[0] / 3,y1),False)
drawLine((x0 + 2 * RESOLUTION[0] / 3,y0),(x1 + 2 * RESOLUTION[0] / 3,y1),True)
for i in range(RESOLUTION[1] * SCALE):
pixels[int(RESOLUTION[0] * SCALE / 3),i] = (0,0,0)
pixels[int(2 * RESOLUTION[0] * SCALE / 3),i] = (0,0,0)
img.save("out" + str(f).zfill(2) + ".png")