Fr3deric
7 years ago
1 changed files with 122 additions and 0 deletions
@ -0,0 +1,122 @@
@@ -0,0 +1,122 @@
|
||||
#!/usr/bin/env python3 |
||||
|
||||
import sys |
||||
import random |
||||
import numpy as np |
||||
import argparse |
||||
import blup.frame |
||||
import blup.output |
||||
import blup.animation |
||||
import blup.writebml |
||||
import colorsys |
||||
|
||||
|
||||
WIDTH = 22 |
||||
HEIGHT = 16 |
||||
DEPTH = 256 |
||||
|
||||
|
||||
def fill_trace(points): |
||||
for i in range(len(points)): |
||||
yield points[i] |
||||
if i == len(points)-1: |
||||
break |
||||
v = points[i+1] - points[i] |
||||
l = int(np.linalg.norm(v)) |
||||
for j in range(l): |
||||
yield points[i] + v * (j+1)/(l+1) |
||||
|
||||
|
||||
def convert_color(c): |
||||
return list(map(lambda x: int(round(x*(DEPTH-1))), c)) |
||||
|
||||
|
||||
def get_random_color(): |
||||
return colorsys.hsv_to_rgb(random.random(), 1, 1) |
||||
|
||||
|
||||
class Orb: |
||||
def __init__(self, pos, speed, tracelen, color, tracecolor, boxsize): |
||||
self.pos = pos |
||||
self.speed = speed |
||||
self.tracelen = tracelen |
||||
self.color = color |
||||
self.tracecolor = tracecolor |
||||
self.boxsize = boxsize |
||||
self.trace = [] |
||||
|
||||
def update(self, dt): |
||||
newpos = self.pos + self.speed * dt |
||||
#newpos = self.pos |
||||
for dim in [0, 1]: |
||||
if newpos[dim] >= self.boxsize[dim] or newpos[dim] <= 0: |
||||
newpos[dim] = 0 if newpos[dim]<0 else self.boxsize[dim]-1 |
||||
self.speed[dim] *= -1 |
||||
self.speed += np.array([random.randint(-5, 6), random.randint(-5, 6)]) |
||||
self.trace.insert(0, self.pos) |
||||
self.trace = self.trace[:self.tracelen] |
||||
self.pos = newpos |
||||
|
||||
def draw(self, frame): |
||||
for i, p in enumerate(fill_trace([self.pos] + self.trace)): |
||||
f = (self.tracelen - i) / self.tracelen |
||||
try: |
||||
c = colorsys.rgb_to_hsv(*self.tracecolor) |
||||
s = 0.1 if random.random()>0.9 else c[1] |
||||
c = colorsys.hsv_to_rgb(c[0], s, c[2]*f) |
||||
frame.setPixel(int(p[0]), int(p[1]), convert_color(c)) |
||||
except ValueError: |
||||
pass |
||||
|
||||
offs = [ np.array([x,y]) for x in [-1,0,1] for y in [-1,0,1] ] |
||||
points = [] |
||||
for o in offs: |
||||
p = self.pos.astype('int') + o |
||||
if random.random() > 0.2 and not (p == np.array([0,0])).all(): |
||||
points.append(p) |
||||
for p in points: |
||||
try: |
||||
c = colorsys.rgb_to_hsv(*self.color) |
||||
c = colorsys.hsv_to_rgb(c[0], c[1], c[2]*0.2) |
||||
frame.setPixel(p[0], p[1], convert_color(c)) |
||||
except ValueError: |
||||
pass |
||||
|
||||
frame.setPixel(int(self.pos[0]), int(self.pos[1]), convert_color(self.color)) |
||||
|
||||
|
||||
if __name__ == '__main__': |
||||
parser = argparse.ArgumentParser(description='Generate plasma animations') |
||||
parser.add_argument('-d', '--delay', type=int, default=50) |
||||
parser.add_argument('-t', '--time', type=int, default=15) |
||||
parser.add_argument('-n', '--num-orbs', type=int, default=2) |
||||
parser.add_argument('output_file') |
||||
args = parser.parse_args() |
||||
|
||||
dim = blup.frame.FrameDimension(WIDTH, HEIGHT, DEPTH, 3) |
||||
anim = blup.animation.Animation(dim) |
||||
anim.tags['description'] = ' '.join(sys.argv) |
||||
|
||||
orbs = [] |
||||
for i in range(args.num_orbs): |
||||
orbs.append(Orb( |
||||
np.array([random.randint(0, WIDTH-1),random.randint(0, HEIGHT-1)]), |
||||
np.array([8,10]), |
||||
20, |
||||
get_random_color(), |
||||
get_random_color(), |
||||
np.array([WIDTH, HEIGHT]) |
||||
)) |
||||
|
||||
t = 0 |
||||
while t < args.time: |
||||
t += args.delay / 1000 |
||||
frame = blup.animation.AnimationFrame(dim, args.delay) |
||||
|
||||
for orb in orbs: |
||||
orb.update(args.delay / 1000) |
||||
orb.draw(frame) |
||||
|
||||
anim.addFrame(frame) |
||||
|
||||
blup.writebml.writeBml(anim, args.output_file) |
Loading…
Reference in new issue