74 TEveTrans::TEveTrans() :
76 fA1(0), fA2(0), fA3(0), fAsOK(kFALSE),
88 TEveTrans::TEveTrans(
const TEveTrans& t) :
90 fA1(t.fA1), fA2(t.fA2), fA3(t.fA3), fAsOK(t.fAsOK),
91 fUseTrans (t.fUseTrans),
92 fEditTrans(t.fEditTrans),
102 TEveTrans::TEveTrans(
const Double_t arr[16]) :
104 fA1(0), fA2(0), fA3(0), fAsOK(kFALSE),
107 fEditRotation(kTRUE),
116 TEveTrans::TEveTrans(
const Float_t arr[16]) :
118 fA1(0), fA2(0), fA3(0), fAsOK(kFALSE),
121 fEditRotation(kTRUE),
130 void TEveTrans::UnitTrans()
132 memset(fM, 0, 16*
sizeof(Double_t));
133 fM[F00] = fM[F11] = fM[F22] = fM[F33] = 1;
142 void TEveTrans::ZeroTrans(Double_t w)
144 memset(fM, 0, 16*
sizeof(Double_t));
153 void TEveTrans::UnitRot()
155 memset(fM, 0, 12*
sizeof(Double_t));
156 fM[F00] = fM[F11] = fM[F22] = 1;
164 void TEveTrans::SetTrans(
const TEveTrans& t, Bool_t copyAngles)
166 memcpy(fM, t.fM,
sizeof(fM));
167 if (copyAngles && t.fAsOK) {
169 fA1 = t.fA1; fA2 = t.fA2; fA3 = t.fA3;
178 void TEveTrans::SetFromArray(
const Double_t arr[16])
180 for(Int_t i=0; i<16; ++i) fM[i] = arr[i];
187 void TEveTrans::SetFromArray(
const Float_t arr[16])
189 for(Int_t i=0; i<16; ++i) fM[i] = arr[i];
199 void TEveTrans::SetupRotation(Int_t i, Int_t j, Double_t f)
202 TEveTrans& t = *
this;
203 t(i,i) = t(j,j) = TMath::Cos(f);
204 Double_t s = TMath::Sin(f);
205 t(i,j) = -s; t(j,i) = s;
219 void TEveTrans::SetupFromToVec(
const TEveVector& from,
const TEveVector& to)
221 static const float kFromToEpsilon = 0.000001f;
227 f = (e < 0.0f) ? -e : e;
229 if (f > 1.0f - kFromToEpsilon)
235 x.fX = (from.fX > 0.0f) ? from.fX : -from.fX;
236 x.fY = (from.fY > 0.0f) ? from.fY : -from.fY;
237 x.fZ = (from.fZ > 0.0f) ? from.fZ : -from.fZ;
242 x.fX = 1.0f; x.fY = x.fZ = 0.0f;
244 x.fZ = 1.0f; x.fX = x.fY = 0.0f;
250 x.fY = 1.0f; x.fX = x.fZ = 0.0f;
252 x.fZ = 1.0f; x.fX = x.fY = 0.0f;
259 c1 = 2.0f / u.Mag2();
260 c2 = 2.0f / v.Mag2();
261 c3 = c1 * c2 * u.Dot(v);
263 for (
int i = 0; i < 3; i++) {
264 for (
int j = 0; j < 3; j++) {
265 CM(i, j) = - c1 * u[i] * u[j]
274 TEveVector v = from.Cross(to);
276 Float_t h, hvx, hvz, hvxy, hvxz, hvyz;
284 CM(0, 0) = e + hvx * v.fX;
285 CM(0, 1) = hvxy - v.fZ;
286 CM(0, 2) = hvxz + v.fY;
288 CM(1, 0) = hvxy + v.fZ;
289 CM(1, 1) = e + h * v.fY * v.fY;
290 CM(1, 2) = hvyz - v.fX;
292 CM(2, 0) = hvxz - v.fY;
293 CM(2, 1) = hvyz + v.fX;
294 CM(2, 2) = e + hvz * v.fZ;
301 void TEveTrans::MultLeft(
const TEveTrans& t)
305 for(
int c=0; c<4; ++c, col+=4) {
306 const Double_t* row = t.fM;
307 for(
int r=0; r<4; ++r, ++row)
308 buf[r] = row[0]*col[0] + row[4]*col[1] + row[8]*col[2] + row[12]*col[3];
309 col[0] = buf[0]; col[1] = buf[1]; col[2] = buf[2]; col[3] = buf[3];
317 void TEveTrans::MultRight(
const TEveTrans& t)
321 for(
int r=0; r<4; ++r, ++row) {
322 const Double_t* col = t.fM;
323 for(
int c=0; c<4; ++c, col+=4)
324 buf[c] = row[0]*col[0] + row[4]*col[1] + row[8]*col[2] + row[12]*col[3];
325 row[0] = buf[0]; row[4] = buf[1]; row[8] = buf[2]; row[12] = buf[3];
334 TEveTrans TEveTrans::operator*(
const TEveTrans& t)
344 void TEveTrans::TransposeRotationPart()
347 x = fM[F01]; fM[F01] = fM[F10]; fM[F10] = x;
348 x = fM[F02]; fM[F02] = fM[F20]; fM[F20] = x;
349 x = fM[F12]; fM[F12] = fM[F21]; fM[F21] = x;
356 void TEveTrans::MoveLF(Int_t ai, Double_t amount)
358 const Double_t *col = fM + 4*--ai;
359 fM[F03] += amount*col[0]; fM[F13] += amount*col[1]; fM[F23] += amount*col[2];
365 void TEveTrans::Move3LF(Double_t x, Double_t y, Double_t z)
367 fM[F03] += x*fM[0] + y*fM[4] + z*fM[8];
368 fM[F13] += x*fM[1] + y*fM[5] + z*fM[9];
369 fM[F23] += x*fM[2] + y*fM[6] + z*fM[10];
375 void TEveTrans::RotateLF(Int_t i1, Int_t i2, Double_t amount)
380 const Double_t cos = TMath::Cos(amount), sin = TMath::Sin(amount);
383 --i1 <<= 2; --i2 <<= 2;
384 for (
int r=0; r<4; ++r, ++row) {
385 b1 = cos*row[i1] + sin*row[i2];
386 b2 = cos*row[i2] - sin*row[i1];
387 row[i1] = b1; row[i2] = b2;
395 void TEveTrans::MovePF(Int_t ai, Double_t amount)
397 fM[F03 + --ai] += amount;
403 void TEveTrans::Move3PF(Double_t x, Double_t y, Double_t z)
413 void TEveTrans::RotatePF(Int_t i1, Int_t i2, Double_t amount)
419 const Double_t cos = TMath::Cos(amount), sin = TMath::Sin(amount);
423 for(
int c=0; c<4; ++c, col+=4) {
424 b1 = cos*col[i1] - sin*col[i2];
425 b2 = cos*col[i2] + sin*col[i1];
426 col[i1] = b1; col[i2] = b2;
434 void TEveTrans::Move(
const TEveTrans& a, Int_t ai, Double_t amount)
436 const Double_t* vec = a.fM + 4*--ai;
437 fM[F03] += amount*vec[0];
438 fM[F13] += amount*vec[1];
439 fM[F23] += amount*vec[2];
445 void TEveTrans::Move3(
const TEveTrans& a, Double_t x, Double_t y, Double_t z)
447 const Double_t* m = a.fM;
448 fM[F03] += x*m[F00] + y*m[F01] + z*m[F02];
449 fM[F13] += x*m[F10] + y*m[F11] + z*m[F12];
450 fM[F23] += x*m[F20] + y*m[F21] + z*m[F22];
457 void TEveTrans::Rotate(
const TEveTrans& a, Int_t i1, Int_t i2, Double_t amount)
463 RotatePF(i1, i2, amount);
471 void TEveTrans::SetBaseVec(Int_t b, Double_t x, Double_t y, Double_t z)
473 Double_t* col = fM + 4*--b;
474 col[0] = x; col[1] = y; col[2] = z;
481 void TEveTrans::SetBaseVec(Int_t b,
const TVector3& v)
483 Double_t* col = fM + 4*--b;
491 TVector3 TEveTrans::GetBaseVec(Int_t b)
const
493 return TVector3(&fM[4*--b]);
496 void TEveTrans::GetBaseVec(Int_t b, TVector3& v)
const
500 const Double_t* col = fM + 4*--b;
501 v.SetXYZ(col[0], col[1], col[2]);
507 void TEveTrans::SetPos(Double_t x, Double_t y, Double_t z)
509 fM[F03] = x; fM[F13] = y; fM[F23] = z;
512 void TEveTrans::SetPos(Double_t* x)
515 fM[F03] = x[0]; fM[F13] = x[1]; fM[F23] = x[2];
518 void TEveTrans::SetPos(Float_t* x)
521 fM[F03] = x[0]; fM[F13] = x[1]; fM[F23] = x[2];
524 void TEveTrans::SetPos(
const TEveTrans& t)
527 const Double_t* m = t.fM;
528 fM[F03] = m[F03]; fM[F13] = m[F13]; fM[F23] = m[F23];
534 void TEveTrans::GetPos(Double_t& x, Double_t& y, Double_t& z)
const
536 x = fM[F03]; y = fM[F13]; z = fM[F23];
539 void TEveTrans::GetPos(Double_t* x)
const
542 x[0] = fM[F03]; x[1] = fM[F13]; x[2] = fM[F23];
545 void TEveTrans::GetPos(Float_t* x)
const
548 x[0] = fM[F03]; x[1] = fM[F13]; x[2] = fM[F23];
551 void TEveTrans::GetPos(TVector3& v)
const
554 v.SetXYZ(fM[F03], fM[F13], fM[F23]);
557 TVector3 TEveTrans::GetPos()
const
560 return TVector3(fM[F03], fM[F13], fM[F23]);
565 inline void clamp_angle(Float_t& a)
567 while(a < -TMath::TwoPi()) a += TMath::TwoPi();
568 while(a > TMath::TwoPi()) a -= TMath::TwoPi();
572 void TEveTrans::SetRotByAngles(Float_t a1, Float_t a2, Float_t a3)
577 clamp_angle(a1); clamp_angle(a2); clamp_angle(a3);
579 Double_t a, b, c, d, e, f;
580 a = TMath::Cos(a3); b = TMath::Sin(a3);
581 c = TMath::Cos(a2); d = TMath::Sin(a2);
582 e = TMath::Cos(a1); f = TMath::Sin(a1);
583 Double_t ad = a*d, bd = b*d;
585 fM[F00] = c*e; fM[F01] = -bd*e - a*f; fM[F02] = -ad*e + b*f;
586 fM[F10] = c*f; fM[F11] = -bd*f + a*e; fM[F12] = -ad*f - b*e;
587 fM[F20] = d; fM[F21] = b*c; fM[F22] = a*c;
589 fA1 = a1; fA2 = a2; fA3 = a3;
602 void TEveTrans::SetRotByAnyAngles(Float_t a1, Float_t a2, Float_t a3,
605 int n = strspn(pat,
"XxYyZz");
if(n > 3) n = 3;
607 Float_t a[] = { a3, a2, a1 };
609 for(
int i=0; i<n; i++) {
610 if(isupper(pat[i])) a[i] = -a[i];
612 case 'x':
case 'X': RotateLF(2, 3, a[i]);
break;
613 case 'y':
case 'Y': RotateLF(3, 1, a[i]);
break;
614 case 'z':
case 'Z': RotateLF(1, 2, a[i]);
break;
623 void TEveTrans::GetRotAngles(Float_t* x)
const
627 GetScale(sx, sy, sz);
628 Double_t d = fM[F20]/sx;
629 if(d>1) d=1;
else if(d<-1) d=-1;
630 fA2 = TMath::ASin(d);
631 Double_t cos = TMath::Cos(fA2);
632 if(TMath::Abs(cos) > 8.7e-6) {
633 fA1 = TMath::ATan2(fM[F10], fM[F00]);
634 fA3 = TMath::ATan2(fM[F21]/sy, fM[F22]/sz);
636 fA1 = TMath::ATan2(fM[F10]/sx, fM[F11]/sy);
641 x[0] = fA1; x[1] = fA2; x[2] = fA3;
647 void TEveTrans::Scale(Double_t sx, Double_t sy, Double_t sz)
649 fM[F00] *= sx; fM[F10] *= sx; fM[F20] *= sx;
650 fM[F01] *= sy; fM[F11] *= sy; fM[F21] *= sy;
651 fM[F02] *= sz; fM[F12] *= sz; fM[F22] *= sz;
657 Double_t TEveTrans::Unscale()
661 return (sx + sy + sz)/3;
667 void TEveTrans::Unscale(Double_t& sx, Double_t& sy, Double_t& sz)
669 GetScale(sx, sy, sz);
670 fM[F00] /= sx; fM[F10] /= sx; fM[F20] /= sx;
671 fM[F01] /= sy; fM[F11] /= sy; fM[F21] /= sy;
672 fM[F02] /= sz; fM[F12] /= sz; fM[F22] /= sz;
678 void TEveTrans::GetScale(Double_t& sx, Double_t& sy, Double_t& sz)
const
680 sx = TMath::Sqrt( fM[F00]*fM[F00] + fM[F10]*fM[F10] + fM[F20]*fM[F20] );
681 sy = TMath::Sqrt( fM[F01]*fM[F01] + fM[F11]*fM[F11] + fM[F21]*fM[F21] );
682 sz = TMath::Sqrt( fM[F02]*fM[F02] + fM[F12]*fM[F12] + fM[F22]*fM[F22] );
688 void TEveTrans::SetScale(Double_t sx, Double_t sy, Double_t sz)
690 sx /= TMath::Sqrt( fM[F00]*fM[F00] + fM[F10]*fM[F10] + fM[F20]*fM[F20] );
691 sy /= TMath::Sqrt( fM[F01]*fM[F01] + fM[F11]*fM[F11] + fM[F21]*fM[F21] );
692 sz /= TMath::Sqrt( fM[F02]*fM[F02] + fM[F12]*fM[F12] + fM[F22]*fM[F22] );
694 fM[F00] *= sx; fM[F10] *= sx; fM[F20] *= sx;
695 fM[F01] *= sy; fM[F11] *= sy; fM[F21] *= sy;
696 fM[F02] *= sz; fM[F12] *= sz; fM[F22] *= sz;
702 void TEveTrans::SetScaleX(Double_t sx)
704 sx /= TMath::Sqrt( fM[F00]*fM[F00] + fM[F10]*fM[F10] + fM[F20]*fM[F20] );
705 fM[F00] *= sx; fM[F10] *= sx; fM[F20] *= sx;
711 void TEveTrans::SetScaleY(Double_t sy)
713 sy /= TMath::Sqrt( fM[F01]*fM[F01] + fM[F11]*fM[F11] + fM[F21]*fM[F21] );
714 fM[F01] *= sy; fM[F11] *= sy; fM[F21] *= sy;
720 void TEveTrans::SetScaleZ(Double_t sz)
722 sz /= TMath::Sqrt( fM[F02]*fM[F02] + fM[F12]*fM[F12] + fM[F22]*fM[F22] );
723 fM[F02] *= sz; fM[F12] *= sz; fM[F22] *= sz;
729 void TEveTrans::MultiplyIP(TVector3& v, Double_t w)
const
731 v.SetXYZ(fM[F00]*v.x() + fM[F01]*v.y() + fM[F02]*v.z() + fM[F03]*w,
732 fM[F10]*v.x() + fM[F11]*v.y() + fM[F12]*v.z() + fM[F13]*w,
733 fM[F20]*v.x() + fM[F21]*v.y() + fM[F22]*v.z() + fM[F23]*w);
739 void TEveTrans::MultiplyIP(Double_t* v, Double_t w)
const
741 Double_t r[3] = { v[0], v[1], v[2] };
742 v[0] = fM[F00]*r[0] + fM[F01]*r[1] + fM[F02]*r[2] + fM[F03]*w;
743 v[1] = fM[F10]*r[0] + fM[F11]*r[1] + fM[F12]*r[2] + fM[F13]*w;
744 v[2] = fM[F20]*r[0] + fM[F21]*r[1] + fM[F22]*r[2] + fM[F23]*w;
750 void TEveTrans::MultiplyIP(Float_t* v, Double_t w)
const
752 Double_t r[3] = { v[0], v[1], v[2] };
753 v[0] = fM[F00]*r[0] + fM[F01]*r[1] + fM[F02]*r[2] + fM[F03]*w;
754 v[1] = fM[F10]*r[0] + fM[F11]*r[1] + fM[F12]*r[2] + fM[F13]*w;
755 v[2] = fM[F20]*r[0] + fM[F21]*r[1] + fM[F22]*r[2] + fM[F23]*w;
761 TVector3 TEveTrans::Multiply(
const TVector3& v, Double_t w)
const
763 return TVector3(fM[F00]*v.x() + fM[F01]*v.y() + fM[F02]*v.z() + fM[F03]*w,
764 fM[F10]*v.x() + fM[F11]*v.y() + fM[F12]*v.z() + fM[F13]*w,
765 fM[F20]*v.x() + fM[F21]*v.y() + fM[F22]*v.z() + fM[F23]*w);
771 void TEveTrans::Multiply(
const Double_t *vin, Double_t* vout, Double_t w)
const
773 vout[0] = fM[F00]*vin[0] + fM[F01]*vin[1] + fM[F02]*vin[2] + fM[F03]*w;
774 vout[1] = fM[F10]*vin[0] + fM[F11]*vin[1] + fM[F12]*vin[1] + fM[F13]*w;
775 vout[2] = fM[F20]*vin[0] + fM[F21]*vin[1] + fM[F22]*vin[1] + fM[F23]*w;
781 void TEveTrans::RotateIP(TVector3& v)
const
783 v.SetXYZ(fM[F00]*v.x() + fM[F01]*v.y() + fM[F02]*v.z(),
784 fM[F10]*v.x() + fM[F11]*v.y() + fM[F12]*v.z(),
785 fM[F20]*v.x() + fM[F21]*v.y() + fM[F22]*v.z());
791 void TEveTrans::RotateIP(Double_t* v)
const
793 Double_t t[3] = { v[0], v[1], v[2] };
795 v[0] = fM[F00]*t[0] + fM[F01]*t[1] + fM[F02]*t[2];
796 v[1] = fM[F10]*t[0] + fM[F11]*t[1] + fM[F12]*t[2];
797 v[2] = fM[F20]*t[0] + fM[F21]*t[1] + fM[F22]*t[2];
803 void TEveTrans::RotateIP(Float_t* v)
const
805 Double_t t[3] = { v[0], v[1], v[2] };
807 v[0] = fM[F00]*t[0] + fM[F01]*t[1] + fM[F02]*t[2];
808 v[1] = fM[F10]*t[0] + fM[F11]*t[1] + fM[F12]*t[2];
809 v[2] = fM[F20]*t[0] + fM[F21]*t[1] + fM[F22]*t[2];
815 TVector3 TEveTrans::Rotate(
const TVector3& v)
const
817 return TVector3(fM[F00]*v.x() + fM[F01]*v.y() + fM[F02]*v.z(),
818 fM[F10]*v.x() + fM[F11]*v.y() + fM[F12]*v.z(),
819 fM[F20]*v.x() + fM[F21]*v.y() + fM[F22]*v.z());
825 Double_t TEveTrans::Norm3Column(Int_t col)
827 Double_t* c = fM + 4*--col;
828 const Double_t l = TMath::Sqrt(c[0]*c[0] + c[1]*c[1] + c[2]*c[2]);
829 c[0] /= l; c[1] /= l; c[2] /= l;
836 Double_t TEveTrans::Orto3Column(Int_t col, Int_t ref)
838 Double_t* c = fM + 4*--col;
839 Double_t* rc = fM + 4*--ref;
840 const Double_t dp = c[0]*rc[0] + c[1]*rc[1] + c[2]*rc[2];
841 c[0] -= rc[0]*dp; c[1] -= rc[1]*dp; c[2] -= rc[2]*dp;
848 void TEveTrans::OrtoNorm3()
851 Orto3Column(2,1); Norm3Column(2);
852 fM[F02] = fM[F10]*fM[F21] - fM[F11]*fM[F20];
853 fM[F12] = fM[F20]*fM[F01] - fM[F21]*fM[F00];
854 fM[F22] = fM[F00]*fM[F11] - fM[F01]*fM[F10];
863 Double_t TEveTrans::Invert()
865 static const TEveException eh(
"TEveTrans::Invert ");
868 const Double_t det2_12_01 = fM[F10]*fM[F21] - fM[F11]*fM[F20];
869 const Double_t det2_12_02 = fM[F10]*fM[F22] - fM[F12]*fM[F20];
870 const Double_t det2_12_03 = fM[F10]*fM[F23] - fM[F13]*fM[F20];
871 const Double_t det2_12_13 = fM[F11]*fM[F23] - fM[F13]*fM[F21];
872 const Double_t det2_12_23 = fM[F12]*fM[F23] - fM[F13]*fM[F22];
873 const Double_t det2_12_12 = fM[F11]*fM[F22] - fM[F12]*fM[F21];
874 const Double_t det2_13_01 = fM[F10]*fM[F31] - fM[F11]*fM[F30];
875 const Double_t det2_13_02 = fM[F10]*fM[F32] - fM[F12]*fM[F30];
876 const Double_t det2_13_03 = fM[F10]*fM[F33] - fM[F13]*fM[F30];
877 const Double_t det2_13_12 = fM[F11]*fM[F32] - fM[F12]*fM[F31];
878 const Double_t det2_13_13 = fM[F11]*fM[F33] - fM[F13]*fM[F31];
879 const Double_t det2_13_23 = fM[F12]*fM[F33] - fM[F13]*fM[F32];
880 const Double_t det2_23_01 = fM[F20]*fM[F31] - fM[F21]*fM[F30];
881 const Double_t det2_23_02 = fM[F20]*fM[F32] - fM[F22]*fM[F30];
882 const Double_t det2_23_03 = fM[F20]*fM[F33] - fM[F23]*fM[F30];
883 const Double_t det2_23_12 = fM[F21]*fM[F32] - fM[F22]*fM[F31];
884 const Double_t det2_23_13 = fM[F21]*fM[F33] - fM[F23]*fM[F31];
885 const Double_t det2_23_23 = fM[F22]*fM[F33] - fM[F23]*fM[F32];
888 const Double_t det3_012_012 = fM[F00]*det2_12_12 - fM[F01]*det2_12_02 + fM[F02]*det2_12_01;
889 const Double_t det3_012_013 = fM[F00]*det2_12_13 - fM[F01]*det2_12_03 + fM[F03]*det2_12_01;
890 const Double_t det3_012_023 = fM[F00]*det2_12_23 - fM[F02]*det2_12_03 + fM[F03]*det2_12_02;
891 const Double_t det3_012_123 = fM[F01]*det2_12_23 - fM[F02]*det2_12_13 + fM[F03]*det2_12_12;
892 const Double_t det3_013_012 = fM[F00]*det2_13_12 - fM[F01]*det2_13_02 + fM[F02]*det2_13_01;
893 const Double_t det3_013_013 = fM[F00]*det2_13_13 - fM[F01]*det2_13_03 + fM[F03]*det2_13_01;
894 const Double_t det3_013_023 = fM[F00]*det2_13_23 - fM[F02]*det2_13_03 + fM[F03]*det2_13_02;
895 const Double_t det3_013_123 = fM[F01]*det2_13_23 - fM[F02]*det2_13_13 + fM[F03]*det2_13_12;
896 const Double_t det3_023_012 = fM[F00]*det2_23_12 - fM[F01]*det2_23_02 + fM[F02]*det2_23_01;
897 const Double_t det3_023_013 = fM[F00]*det2_23_13 - fM[F01]*det2_23_03 + fM[F03]*det2_23_01;
898 const Double_t det3_023_023 = fM[F00]*det2_23_23 - fM[F02]*det2_23_03 + fM[F03]*det2_23_02;
899 const Double_t det3_023_123 = fM[F01]*det2_23_23 - fM[F02]*det2_23_13 + fM[F03]*det2_23_12;
900 const Double_t det3_123_012 = fM[F10]*det2_23_12 - fM[F11]*det2_23_02 + fM[F12]*det2_23_01;
901 const Double_t det3_123_013 = fM[F10]*det2_23_13 - fM[F11]*det2_23_03 + fM[F13]*det2_23_01;
902 const Double_t det3_123_023 = fM[F10]*det2_23_23 - fM[F12]*det2_23_03 + fM[F13]*det2_23_02;
903 const Double_t det3_123_123 = fM[F11]*det2_23_23 - fM[F12]*det2_23_13 + fM[F13]*det2_23_12;
906 const Double_t det = fM[F00]*det3_123_123 - fM[F01]*det3_123_023 +
907 fM[F02]*det3_123_013 - fM[F03]*det3_123_012;
910 throw(eh +
"matrix is singular.");
913 const Double_t oneOverDet = 1.0/det;
914 const Double_t mn1OverDet = - oneOverDet;
916 fM[F00] = det3_123_123 * oneOverDet;
917 fM[F01] = det3_023_123 * mn1OverDet;
918 fM[F02] = det3_013_123 * oneOverDet;
919 fM[F03] = det3_012_123 * mn1OverDet;
921 fM[F10] = det3_123_023 * mn1OverDet;
922 fM[F11] = det3_023_023 * oneOverDet;
923 fM[F12] = det3_013_023 * mn1OverDet;
924 fM[F13] = det3_012_023 * oneOverDet;
926 fM[F20] = det3_123_013 * oneOverDet;
927 fM[F21] = det3_023_013 * mn1OverDet;
928 fM[F22] = det3_013_013 * oneOverDet;
929 fM[F23] = det3_012_013 * mn1OverDet;
931 fM[F30] = det3_123_012 * mn1OverDet;
932 fM[F31] = det3_023_012 * oneOverDet;
933 fM[F32] = det3_013_012 * mn1OverDet;
934 fM[F33] = det3_012_012 * oneOverDet;
943 void TEveTrans::Streamer(TBuffer &R__b)
945 if (R__b.IsReading()) {
946 TEveTrans::Class()->ReadBuffer(R__b,
this);
949 TEveTrans::Class()->WriteBuffer(R__b,
this);
956 void TEveTrans::Print(Option_t* )
const
958 const Double_t* row = fM;
959 for(Int_t i=0; i<4; ++i, ++row)
960 printf(
"%8.3f %8.3f %8.3f | %8.3f\n", row[0], row[4], row[8], row[12]);
968 std::ostream& operator<<(std::ostream& s,
const TEveTrans& t)
970 s.setf(std::ios::fixed, std::ios::floatfield);
972 for(Int_t i=1; i<=4; i++)
973 for(Int_t j=1; j<=4; j++)
974 s << t(i,j) << ((j==4) ?
"\n" :
"\t");
981 void TEveTrans::SetFrom(Double_t* carr)
986 memcpy(fM, carr, 16*
sizeof(Double_t));
993 void TEveTrans::SetFrom(
const TGeoMatrix& mat)
996 const Double_t *r = mat.GetRotationMatrix();
997 const Double_t *t = mat.GetTranslation();
1001 const Double_t *s = mat.GetScale();
1002 m[0] = r[0]*s[0]; m[1] = r[3]*s[0]; m[2] = r[6]*s[0]; m[3] = 0;
1003 m[4] = r[1]*s[1]; m[5] = r[4]*s[1]; m[6] = r[7]*s[1]; m[7] = 0;
1004 m[8] = r[2]*s[2]; m[9] = r[5]*s[2]; m[10] = r[8]*s[2]; m[11] = 0;
1005 m[12] = t[0]; m[13] = t[1]; m[14] = t[2]; m[15] = 1;
1009 m[0] = r[0]; m[1] = r[3]; m[2] = r[6]; m[3] = 0;
1010 m[4] = r[1]; m[5] = r[4]; m[6] = r[7]; m[7] = 0;
1011 m[8] = r[2]; m[9] = r[5]; m[10] = r[8]; m[11] = 0;
1012 m[12] = t[0]; m[13] = t[1]; m[14] = t[2]; m[15] = 1;
1020 void TEveTrans::SetGeoHMatrix(TGeoHMatrix& mat)
1022 Double_t *r = mat.GetRotationMatrix();
1023 Double_t *t = mat.GetTranslation();
1024 Double_t *s = mat.GetScale();
1027 mat.SetBit(TGeoMatrix::kGeoGenTrans);
1029 GetScale(s[0], s[1], s[2]);
1030 r[0] = m[0]/s[0]; r[3] = m[1]/s[0]; r[6] = m[2]/s[0]; m += 4;
1031 r[1] = m[0]/s[1]; r[4] = m[1]/s[1]; r[7] = m[2]/s[1]; m += 4;
1032 r[2] = m[0]/s[2]; r[5] = m[1]/s[2]; r[8] = m[2]/s[2]; m += 4;
1033 t[0] = m[0]; t[1] = m[1]; t[2] = m[2];
1037 mat.ResetBit(TGeoMatrix::kGeoGenTrans);
1038 r[0] = 1; r[3] = 0; r[6] = 0;
1039 r[1] = 0; r[4] = 1; r[7] = 0;
1040 r[2] = 0; r[5] = 0; r[8] = 1;
1041 s[0] = s[1] = s[2] = 1;
1042 t[0] = t[1] = t[2] = 0;
1049 void TEveTrans::SetBuffer3D(TBuffer3D& buff)
1051 buff.fLocalFrame = fUseTrans;
1056 Double_t *m = buff.fLocalMaster;
1057 m[0] = fM[0]; m[1] = fM[4]; m[2] = fM[8]; m[3] = fM[3];
1058 m[4] = fM[1]; m[5] = fM[5]; m[6] = fM[9]; m[7] = fM[7];
1059 m[8] = fM[2]; m[9] = fM[6]; m[10] = fM[10]; m[11] = fM[11];
1060 m[12] = fM[12]; m[13] = fM[13]; m[14] = fM[14]; m[15] = fM[15];
1074 Bool_t TEveTrans::IsScale(Double_t low, Double_t high)
const
1076 if (!fUseTrans)
return kFALSE;
1078 s = fM[F00]*fM[F00] + fM[F10]*fM[F10] + fM[F20]*fM[F20];
1079 if (s < low || s > high)
return kTRUE;
1080 s = fM[F01]*fM[F01] + fM[F11]*fM[F11] + fM[F21]*fM[F21];
1081 if (s < low || s > high)
return kTRUE;
1082 s = fM[F02]*fM[F02] + fM[F12]*fM[F12] + fM[F22]*fM[F22];
1083 if (s < low || s > high)
return kTRUE;