# U,V Value DualCmapΒΆ

The DualCmap object is used to show the u,v parameter values in the surface:

REOM: 1

```import numpy as np
from matplotlib import pyplot as plt
import s3dlib.surface as s3d
import s3dlib.cmap_utilities as cmu

#.. parameter u,v DualCmap colormap

# 1. Define functions to examine ...................................
def boy(xyz) :
x,y,z = xyz      # u,v => x,y
u = np.pi*x/2
v = np.pi*(1+y)/2
X = (np.sqrt(2)*(np.cos(v)*np.cos(v))*np.cos(2*u) + np.cos(u)*np.sin(2*v))/(2 - np.sqrt(2)*np.sin(3*u)*np.sin(2*v))
Y = (np.sqrt(2)*(np.cos(v)*np.cos(v))*np.sin(2*u) - np.sin(u)*np.sin(2*v))/(2 - np.sqrt(2)*np.sin(3*u)*np.sin(2*v))
Z = (3*(np.cos(v)*np.cos(v)))/(2 - np.sqrt(2)*np.sin(3*u)*np.sin(2*v))
Z -= 2  # added offset for axis position.
return X,Y,Z

def dini(rtz) :
r,t,z = rtz      # u,v => t,r
a, b = 1, 0.2
T = 2*t
x = a*np.cos(T)*np.sin(r)
y = a*np.sin(T)*np.sin(r)
z = a*(np.cos(r) + np.log(np.tan(r/2))) + b*T
return x,y, 0.333*z    # note: scale.z

def bour(rtz) :
r,t,z = rtz      # u,v => r,t
T = 2*t
x = r*np.cos(T) - np.power(r,2.0)*np.cos(2*T)/2.0
y = -r*np.sin(T) * ( r*np.cos(T) + 1.0)
z = 1.3333*np.power(r,1.5)*np.cos(1.5*T)
return x,y,z

def roman(rtp) :
r,t,p = rtp      # u,v => t,p
ct, st = np.cos(t), np.sin(t)
cp, sp = np.cos(p), np.sin(p)
cp_sp = cp*sp
ct_st = ct*st
x = cp*ct_st
y = sp*ct_st
z = cp_sp*np.square(ct)
return x,y,z

def klein(rtp) :
r,t,p = rtp      # u,v => p,t
u = p
v = t
cU, sU = np.cos(u), np.sin(u)
cV, sV = np.cos(v), np.sin(v)
x = -(2/15)*cU* \
(  ( 3 )*cV + \
( -30 + 90*np.power(cU,4) - 60*np.power(cU,6) + 5*cU*cV )*sU \
)
y = -(1/15)*sU* \
(  ( 3 - 3*np.power(cU,2) -48*np.power(cU,4) +48*np.power(cU,6) )*cV + \
(-60 + ( 5*cU - 5*np.power(cU,3) - 80*np.power(cU,5) + 80*np.power(cU,7) )*cV  )*sU \
)
z = (2/15)*( 3 + 5*cU*sU )*sV
return x,y,z

def fig8(rtp) :
r,t,p = rtp      # u,v => t,p
v = 2*p
R=2
Q = ( R + np.cos(t/2)*np.sin(v) - np.sin(t/2)*np.sin(2*v) )
x = Q*np.cos(t)
y = Q*np.sin(t)
z = np.sin(t/2)*np.sin(v) + np.cos(t/2)*np.sin(2*v)
return x,y,z

# 2. Setup and map surface .........................................
rez = 6
kr = cmu.hsv_cmap_gradient( [0.00,1,0], [0.00,1,1],name='black_red' )
kg = cmu.hsv_cmap_gradient( [0.33,1,0], [0.33,1,1],name='black_green' )
cmap2d = cmu.DualCmap(kr,kg)

boyS = s3d.PlanarSurface(rez, basetype='oct1')
boyuv = lambda xyz : cmap2d(xyz[0],xyz[1])

diniuv = lambda rtz : cmap2d(rtz[1],rtz[0])

bourS = s3d.PolarSurface(rez, basetype='hex_c')
bouruv = lambda rtz : cmap2d(rtz[0],rtz[1])

romanuv = lambda rtp : cmap2d(rtp[1],rtp[2])

kleinuv = lambda rtp : cmap2d(rtp[2],rtp[1])

fig8S = s3d.SphericalSurface(rez,basetype='octa_c')
fig8uv = lambda rtp : cmap2d(rtp[1],rtp[2])

surfaces = [ boyS,  diniS,  bourS,  romanS,  kleinS,  fig8S ]
geomFunc = [ boy,   dini,   bour,   roman,   klein,   fig8 ]
colorLam = [ boyuv, diniuv, bouruv, romanuv, kleinuv, fig8uv ]
elevazim = [ None,       [20,-60],    [30,-40], [20,-80],     [20,-125],  [35,-60] ]
minmaxAr = [ [-1.4,1.4], [-0.75,.75], [-1,1],   [-.375,.375], [-1.5,1.5], [-2,2]   ]

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

fig = plt.figure(figsize=(7.5,5))

for i,surface in enumerate(surfaces) :
ax.set_axis_off()
minmax, elaz = minmaxAr[i], elevazim[i]
ax.set(xlim=minmax, ylim=minmax, zlim=minmax)
if elaz is not None : ax.view_init(*elaz)
geomF, colorUV = geomFunc[i], colorLam[i]
surface.map_geom_from_op(  geomF, returnxyz=True )
surface.map_color_from_op( colorUV )
if i==4 : surface.transform(s3d.eulerRot(0,-90),translate=[0,0,2])
ax.set_title(surface.name , fontsize='xx-large')