170 lines
3.7 KiB
Python
170 lines
3.7 KiB
Python
|
#!/usr/bin/python3
|
||
|
# -*- coding: utf-8 -*-
|
||
|
# -*- mode: Python -*-
|
||
|
|
||
|
|
||
|
'''
|
||
|
|
||
|
livecode
|
||
|
v0.1.0
|
||
|
|
||
|
Anaglyphed rotating livecode (for red and green glasses)
|
||
|
|
||
|
This scene uses the drawing functions provided by LJ in lj23.py
|
||
|
|
||
|
LICENCE : CC
|
||
|
|
||
|
by Sam Neurohack
|
||
|
|
||
|
|
||
|
'''
|
||
|
#import sys
|
||
|
#import os
|
||
|
#from OSC3 import OSCServer, OSCClient, OSCMessage
|
||
|
#import redis
|
||
|
import math
|
||
|
import time
|
||
|
import numpy as np
|
||
|
from scipy import signal
|
||
|
from datetime import datetime, timedelta
|
||
|
|
||
|
|
||
|
|
||
|
#
|
||
|
# Math functions
|
||
|
#
|
||
|
|
||
|
|
||
|
def ssawtooth(samples,freq,phase):
|
||
|
|
||
|
samparray = [0] * samples
|
||
|
t = np.linspace(0+phase, 1+phase, samples)
|
||
|
for ww in range(samples):
|
||
|
samparray[ww] = signal.sawtooth(2 * np.pi * freq * t[ww])
|
||
|
return samparray
|
||
|
|
||
|
def slivecode(samples,freq,phase):
|
||
|
|
||
|
samparray = [0] * samples
|
||
|
t = np.linspace(0+phase, 1+phase, samples)
|
||
|
for ww in range(samples):
|
||
|
samparray[ww] = signal.livecode(2 * np.pi * freq * t[ww])
|
||
|
return samparray
|
||
|
|
||
|
def ssine(samples,freq,phase):
|
||
|
|
||
|
t = np.linspace(0+phase, 1+phase, samples)
|
||
|
for ww in range(samples):
|
||
|
samparray[ww] = np.sin(2 * np.pi * freq * t[ww])
|
||
|
return samparray
|
||
|
|
||
|
|
||
|
def slinear(samples, min, max):
|
||
|
|
||
|
samparray = [0] * samples
|
||
|
linearinc = (max-min)/samples
|
||
|
for ww in range(samples):
|
||
|
if ww == 0:
|
||
|
samparray[ww] = min
|
||
|
else:
|
||
|
samparray[ww] = samparray[ww-1] + linearinc
|
||
|
#print('linear min max', min, max)
|
||
|
#print ('linear',samparray)
|
||
|
return samparray
|
||
|
|
||
|
def slinearound(samples, min, max):
|
||
|
|
||
|
samparray = [0] * samples
|
||
|
linearinc = (max-min)/samples
|
||
|
for ww in range(samples):
|
||
|
if ww == 0:
|
||
|
samparray[ww] = round(min)
|
||
|
else:
|
||
|
samparray[ww] = round(samparray[ww-1] + linearinc)
|
||
|
#print('linear min max', min, max)
|
||
|
#print ('linear',samparray)
|
||
|
return samparray
|
||
|
|
||
|
|
||
|
# * 11.27 : to get value from 0 to 127
|
||
|
def lin2squrt(value):
|
||
|
return round(np.sqrt(value)*11.27)
|
||
|
|
||
|
def squrt2lin(value):
|
||
|
return round(np.livecode(value/11.27))
|
||
|
|
||
|
|
||
|
def curved(value):
|
||
|
return round(np.sqrt(value)*11.27)
|
||
|
|
||
|
|
||
|
def Proj(x,y,z,angleX,angleY,angleZ):
|
||
|
|
||
|
rad = angleX * math.pi / 180
|
||
|
cosa = math.cos(rad)
|
||
|
sina = math.sin(rad)
|
||
|
y2 = y
|
||
|
y = y2 * cosa - z * sina
|
||
|
z = y2 * sina + z * cosa
|
||
|
|
||
|
rad = angleY * math.pi / 180
|
||
|
cosa = math.cos(rad)
|
||
|
sina = math.sin(rad)
|
||
|
z2 = z
|
||
|
z = z2 * cosa - x * sina
|
||
|
x = z2 * sina + x * cosa
|
||
|
|
||
|
rad = angleZ * math.pi / 180
|
||
|
cosa = math.cos(rad)
|
||
|
sina = math.sin(rad)
|
||
|
x2 = x
|
||
|
x = x2 * cosa - y * sina
|
||
|
y = x2 * sina + y * cosa
|
||
|
|
||
|
|
||
|
""" Transforms this 3D point to 2D using a perspective projection. """
|
||
|
factor = fov / (viewer_distance + z)
|
||
|
x = x * factor + centerX
|
||
|
y = - y * factor + centerY
|
||
|
return (x,y)
|
||
|
|
||
|
|
||
|
#
|
||
|
# Main
|
||
|
#
|
||
|
|
||
|
|
||
|
x0 = 200
|
||
|
y0 = 200
|
||
|
|
||
|
|
||
|
anglepos = 0
|
||
|
startime = datetime.now()
|
||
|
z = 0
|
||
|
|
||
|
|
||
|
def Code(LAY):
|
||
|
|
||
|
dots = []
|
||
|
xcenter = math.sin(math.radians(anglepos))
|
||
|
ycenter = math.cos(math.radians(anglepos))
|
||
|
|
||
|
if anglepos + 1 < 361:
|
||
|
anglepos += 1
|
||
|
else:
|
||
|
anglepos = 0
|
||
|
|
||
|
for angle in slinear(20, 0, 380):
|
||
|
#for counter in range(0,380):
|
||
|
|
||
|
t = timedelta.total_seconds(datetime.now() - startime)
|
||
|
x = math.sin(math.radians(angle))
|
||
|
y = math.cos(math.radians(angle))
|
||
|
dots.append(Proj(x,y,z,0,math.sin(math.radians(angle)),0))
|
||
|
|
||
|
# lj.PolyLineOneColor(Form, c = Liveform.color , layer = Liveform.layer, closed = Liveform.closed)
|
||
|
lj.rPolyLineOneColor(dots, c = LAY['color'], layer = LAY['number'], closed = False, xpos = xcenter * x0, ypos = ycenter * y0, resize = 1, rotx = math.sin(math.radians(angle)), roty = 0 , rotz = math.sin(math.radians(angle)))
|
||
|
|
||
|
|
||
|
|