PEARL Procedures  rev-distro-2.1.1-1-gf419e92-dirty
Igor procedures for the analysis of PEARL data
pearl-polar-coordinates.ipf
Go to the documentation of this file.
1 #pragma rtGlobals=3
2 #pragma version = 1.1
3 #pragma IgorVersion = 6.1
4 #pragma ModuleName = PearlPolarCoordinates
5 
6 // author: matthias.muntwiler@psi.ch
7 // Copyright (c) 2011-13 Paul Scherrer Institut
8 // $Id$
9 
10 function cart2polar(xx, yy, zz, radius, theta, phi)
11  // converts a 3-vector from Cartesian to polar coordinates
12  variable xx, yy, zz
13  variable &radius, &theta, &phi // angles in degrees
14 
15  radius = sqrt(xx^2 + yy^2 + zz^2)
16 
17  if (radius > 0)
18  theta = acos(zz / radius) * 180 / pi
19  else
20  theta = 0
21  endif
22 
23  if (xx > 0)
24  phi = atan(yy / xx) * 180 / pi
25  elseif (xx < 0)
26  phi = atan(yy / xx) * 180 / pi + 180
27  else
28  if (yy > 0)
29  phi = 90
30  else
31  phi = 270
32  endif
33  endif
34 end
35 
36 function cart2polar_wave(in, out)
37  // converts a wave of 3-vectors from Cartesian to polar coordinates
38  wave in // wave with dimensions (3, N), N >= 1, (x, y, z)
39  wave out // wave same dimensions as in, (radius, theta, phi)
40  // angles in degrees
41 
42  out[0][] = sqrt(in[0][q]^2 + in[1][q]^2 + in[2][q]^2)
43  out[1][] = acos(in[2][q] / out[0][q]) * 180 / pi
44  out[2][] = atan(in[1][q] / in[0][q]) * 180 / pi + 180 * (in[0][q] < 0)
45  out[2][] = numtype(out[2][q]) == 0 ? out[2][q] : 90 + 180 * (in[1][q] < 0)
46 end
47 
48 function polar2cart(radius, theta, phi, xx, yy, zz)
49  // converts a 3-vector from Cartesian to polar coordinates
50  variable radius, theta, phi // angles in degrees
51  variable &xx, &yy, &zz
52 
53  xx = radius * sin(theta * pi / 180) * cos(phi * pi / 180)
54  yy = radius * sin(theta * pi / 180) * sin(phi * pi / 180)
55  zz = radius * cos(theta * pi / 180)
56 end
57 
58 function polar2cart_wave(in, out)
59  // converts a wave of 3-vectors from polar to Cartesian coordinates
60  wave in // wave with dimensions (3, N), N >= 1, (radius, theta, phi)
61  // angles in degrees
62  wave out // wave same dimensions as in, (x, y, z)
63 
64  out[0][] = in[0][q] * sin(in[1][q] * pi / 180) * cos(in[2][q] * pi / 180)
65  out[1][] = in[0][q] * sin(in[1][q] * pi / 180) * sin(in[2][q] * pi / 180)
66  out[2][] = in[0][q] * cos(in[1][q] * pi / 180)
67 end
68 
69 function polar_distance(polar1, azim1, polar2, azim2)
70  // returns the angle between two spherical coordinates
71  variable polar1, azim1
72  // angles in degrees
73  variable polar2, azim2
74  // angles in degrees
75 
76  variable xx1, yy1, zz1
77  variable xx2, yy2, zz2
78 
79  polar2cart(1, polar1, azim1, xx1, yy1, zz1)
80  polar2cart(1, polar2, azim2, xx2, yy2, zz2)
81 
82  variable vv
83  vv = (xx1 * xx2 + yy1 * yy2 + zz1 * zz2) / sqrt(xx1^2 + yy1^2 + zz1^2) / sqrt(xx2^2 + yy2^2 + zz2^2)
84  return acos(vv) * 180 / pi
85 end
variable polar2cart_wave(wave in, wave out)
variable cart2polar(variable xx, variable yy, variable zz, variable *radius, variable *theta, variable *phi)
variable cart2polar_wave(wave in, wave out)
variable polar_distance(variable polar1, variable azim1, variable polar2, variable azim2)
variable polar2cart(variable radius, variable theta, variable phi, variable *xx, variable *yy, variable *zz)