# RGB MappingΒΆ

Animation control:

Visualization Frame Value
Surface geometry sectioning parameter per frame
Surface position fixed to the coordinate axis
Surface color constant
Shading and highlighting fixed to the coordinate axis
Axis coordinate constant
```import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import matplotlib.animation as animation
import s3dlib.surface as s3d

#.. RGB Color Space Animation

# 1. Define function to examine .....................................

def xyz2rgb(xyz) :
# rgb color cube from -1 to 1
x,y,z = xyz
r = ( x + 1 ) /2.0
g = ( y + 1 ) /2.0
b = ( z + 1 ) /2.0
return r,g,b

def get_surface(Z1Z2) :
z1, z2 = Z1Z2
# z1 = f(1,1)    z2 = f(-1,-1)
def topface(xyz, Z1, Z2) :
x,y,z = xyz
Z = ( Z2+Z1)/2.0 - (Z2-Z1)*(x+y)/4.0
return x,y,Z
def sideface(xyz, Z1, Z2, isX=True) :
x,y,z = xyz
Wmax = (Z2+Z1)/2
Wmin = Z1
X,Y = x,y
if isX :
L,H,X = y, x, np.ones(len(x))
else:
L,H,Y = x,-y, np.ones(len(y))
W = -(Wmax-Wmin)*L/2 + (Wmax+Wmin)/2
Z = (W+1)*H/2 + (W-1)/2
return X,Y,Z

rez = 5
ps = lambda : s3d.PlanarSurface(rez)
top = ps().map_geom_from_op(lambda xyz : topface(xyz,z1,z2))
front = ps().map_geom_from_op(lambda xyz : sideface(xyz,z1,z2))
side = ps().map_geom_from_op(lambda xyz : sideface(xyz,z1,z2,False))
surface = top+front+side
surface.map_color_from_op( xyz2rgb )
return surface

def get_frames(n) :
negmin = -0.9999
f2 = np.linspace(-1.0, 1.0, n)
f1 = np.full(n,negmin)
x = np.full(n,1.0)
f2 = np.concatenate( ( f2, np.full(n,1.0) ) )
f1 = np.concatenate( ( f1,np.linspace( negmin, 1.0, n) ) )
f2 = np.concatenate( ( f2,np.linspace( 1.0, negmin, n) ) )
f1 = np.concatenate( ( f1,np.linspace( 1.0, negmin, n) ) )
return np.transpose([f1,f2])

# 2. Setup and map surfaces .........................................
framesize = 30
framearray = get_frames(framesize)

surface = get_surface( framearray[framesize] )

# 3. Construct figure, add surface, plot ............................

fig = plt.figure(figsize=plt.figaspect(1),facecolor='black')
ax = plt.axes(projection='3d')
ax.set(xlim=(-1,1), ylim=(-1,1), zlim=(-1,1) )
ax.set_facecolor('black')
ax.set_proj_type('ortho')
ax.set_axis_off()
ax.view_init(azim=25)

# 4. Animation ......................................................

def init_fig():
return surface,

def update_fig(frame):
global surface
global framearray

ax.collections.remove(surface)
surface = get_surface( framearray[frame] )