; + ; ; Name: thm_part_slice_trans.pro ; ; Purpose: Helper function for the slices routines ; Returns rotaion matrix to new coordinates based on ; specified z and x axes. Will add a translation if ; the CENTER argument is included ; ; Calling sequence: thm_part_slice_trans, z0, x0, [center,] fail=fail ; ; Input: z0: 3 vector specifying new z-axis ; x0: 3 vector specifying new x-axis ; Center: 3 vector specifying the center of the new coordinates ; ; Output: 3x3 rotation matrix ; 4x4 transformation matrix (if CENTER specified) ; ;- function thm_part_slice_trans, z0, x0, center, fail=fail compile_opt idl2, hidden tolerance = 10.0 * 1.19209290e-07 ;Get new x, y, and z axes ;------------------------ ;z z = z0 / sqrt(total(z0^2)) ;x x_tmp = x0 / sqrt(total(x0^2)) x = crossp(z0,crossp(x_tmp, z0)) if total(abs(x)) lt tolerance then begin xstr = '('+strjoin(strtrim(x0,2),',')+')' fail = 'Specified x-axis '+xstr+' has no projection into plane.' dprint, fail return, -1 endif else begin x = x / sqrt(total(x^2)) endelse ;y y = crossp(z, x) ;Create rotation matrix ;---------------------- tm = [[x],[y],[z]] ;Add transformation ;------------------ if keyword_set(center) then begin tm = fltarr(4,4) tm[0:2,0:2] = [[x],[y],[z]] tm[3,3] = 1 orig_pt = !p.t ;save current t3d, /reset !p.t = tm ## !p.t t3d, translate = float(-center) tm = float(!p.t) !p.t = orig_pt ;reset endif ;return matrix return, tm end