18static inline double safe_acos (
double x) {
19 if (std::abs(x) <= 1.0)
return std::acos(x);
20 return ( (x>0) ? 0 : CLHEP::pi );
25 if (j == 0) {
return xx(); }
26 if (j == 1) {
return xy(); }
27 if (j == 2) {
return xz(); }
29 if (j == 0) {
return yx(); }
30 if (j == 1) {
return yy(); }
31 if (j == 2) {
return yz(); }
33 if (j == 0) {
return zx(); }
34 if (j == 1) {
return zy(); }
35 if (j == 2) {
return zz(); }
37 std::cerr <<
"HepRotation subscripting: bad indices "
38 <<
"(" << i <<
"," << j <<
")" << std::endl;
44 double ll = aaxis.
mag();
46 std::cerr <<
"HepRotation::rotate() - "
47 <<
"HepRotation: zero axis" << std::endl;
49 double sa = std::sin(a), ca = std::cos(a);
50 double dx = aaxis.
x()/ll, dy = aaxis.
y()/ll, dz = aaxis.
z()/ll;
52 ca+(1-ca)*dx*dx, (1-ca)*dx*dy-sa*dz, (1-ca)*dx*dz+sa*dy,
53 (1-ca)*dy*dx+sa*dz, ca+(1-ca)*dy*dy, (1-ca)*dy*dz-sa*dx,
54 (1-ca)*dz*dx-sa*dy, (1-ca)*dz*dy+sa*dx, ca+(1-ca)*dz*dz );
62 double c1 = std::cos(a);
63 double s1 = std::sin(a);
75 double c1 = std::cos(a);
76 double s1 = std::sin(a);
88 double c1 = std::cos(a);
89 double s1 = std::sin(a);
106 if (std::abs(newZ.
x()-w.
x()) > del ||
107 std::abs(newZ.
y()-w.
y()) > del ||
108 std::abs(newZ.
z()-w.
z()) > del ||
109 std::abs(newX.
mag2()-1.) > del ||
110 std::abs(newY.
mag2()-1.) > del ||
111 std::abs(newZ.
mag2()-1.) > del ||
112 std::abs(newX.
dot(newY)) > del ||
113 std::abs(newY.
dot(newZ)) > del ||
114 std::abs(newZ.
dot(newX)) > del) {
115 std::cerr <<
"HepRotation::rotateAxes: bad axis vectors" << std::endl;
119 newX.
y(), newY.
y(), newZ.
y(),
120 newX.
z(), newY.
z(), newZ.
z()));
125 return (
yx() == 0.0 &&
xx() == 0.0) ? 0.0 : std::atan2(
yx(),
xx());
129 return (
yy() == 0.0 &&
xy() == 0.0) ? 0.0 : std::atan2(
yy(),
xy());
133 return (
yz() == 0.0 &&
xz() == 0.0) ? 0.0 : std::atan2(
yz(),
xz());
137 return safe_acos(
zx());
141 return safe_acos(
zy());
145 return safe_acos(
zz());
149 double cosa = 0.5*(
xx()+
yy()+
zz()-1);
150 double cosa1 = 1-cosa;
155 double x=0, y=0, z=0;
156 if (
xx() > cosa) x = std::sqrt((
xx()-cosa)/cosa1);
157 if (
yy() > cosa) y = std::sqrt((
yy()-cosa)/cosa1);
158 if (
zz() > cosa) z = std::sqrt((
zz()-cosa)/cosa1);
159 if (
zy() <
yz()) x = -x;
160 if (
xz() <
zx()) y = -y;
161 if (
yx() <
xy()) z = -z;
162 angle = (cosa < -1.) ? std::acos(-1.) : std::acos(cosa);
168 return (
rxx == 1.0 &&
rxy == 0.0 &&
rxz == 0.0 &&
169 ryx == 0.0 &&
ryy == 1.0 &&
ryz == 0.0 &&
170 rzx == 0.0 &&
rzy == 0.0 &&
rzz == 1.0) ? true :
false;
175 else if (
rzy<r.
rzy)
return -1;
else if (
rzy>r.
rzy)
return 1;
176 else if (
rzx<r.
rzx)
return -1;
else if (
rzx>r.
rzx)
return 1;
177 else if (
ryz<r.
ryz)
return -1;
else if (
ryz>r.
ryz)
return 1;
178 else if (
ryy<r.
ryy)
return -1;
else if (
ryy>r.
ryy)
return 1;
179 else if (
ryx<r.
ryx)
return -1;
else if (
ryx>r.
ryx)
return 1;
180 else if (
rxz<r.
rxz)
return -1;
else if (
rxz>r.
rxz)
return 1;
181 else if (
rxy<r.
rxy)
return -1;
else if (
rxy>r.
rxy)
return 1;
182 else if (
rxx<r.
rxx)
return -1;
else if (
rxx>r.
rxx)
return 1;
Hep3Vector cross(const Hep3Vector &) const
double dot(const Hep3Vector &) const
double operator()(int, int) const
HepRotation & rotateAxes(const Hep3Vector &newX, const Hep3Vector &newY, const Hep3Vector &newZ)
HepRotation & rotate(double delta, const Hep3Vector &axis)
HepRotation & transform(const HepRotation &r)
static DLL_API const HepRotation IDENTITY
void getAngleAxis(double &delta, Hep3Vector &axis) const
HepRotation & rotateX(double delta)
HepRotation & rotateZ(double delta)
HepRotation & rotateY(double delta)
int compare(const HepRotation &r) const