74 d.fSpinAxis = spin_axis;
75 d.fSpinAxis *= 1. / al;
76 d.fSpinRate = spin_rate;
78 d.fSpinAxis.Set(0., 0., 1.);
126 fA1(0), fA2(0), fA3(0), fAsOK(
kFALSE),
129 fEditRotation(
kTRUE),
140 fA1(t.fA1), fA2(t.fA2), fA3(t.fA3), fAsOK(t.fAsOK),
141 fUseTrans (t.fUseTrans),
142 fEditTrans(t.fEditTrans),
143 fEditRotation(
kTRUE),
156 fA1(0), fA2(0), fA3(0), fAsOK(
kFALSE),
159 fEditRotation(
kTRUE),
170 fA1(0), fA2(0), fA3(0), fAsOK(
kFALSE),
173 fEditRotation(
kTRUE),
218 memcpy(
fM, t.
fM,
sizeof(
fM));
219 if (copyAngles && t.
fAsOK) {
232 for(
Int_t i=0; i<16; ++i)
fM[i] = arr[i];
241 for(
Int_t i=0; i<16; ++i)
fM[i] = arr[i];
257 t(i,j) = -s; t(j,i) = s;
273 static const float kFromToEpsilon = 0.000001f;
279 f = (
e < 0.0f) ? -
e :
e;
281 if (
f > 1.0f - kFromToEpsilon)
287 x.fX = (from.
fX > 0.0f) ? from.
fX : -from.
fX;
288 x.fY = (from.
fY > 0.0f) ? from.
fY : -from.
fY;
289 x.fZ = (from.
fZ > 0.0f) ? from.
fZ : -from.
fZ;
294 x.fX = 1.0f;
x.fY =
x.fZ = 0.0f;
296 x.fZ = 1.0f;
x.fX =
x.fY = 0.0f;
302 x.fY = 1.0f;
x.fX =
x.fZ = 0.0f;
304 x.fZ = 1.0f;
x.fX =
x.fY = 0.0f;
312 c2 = 2.0f /
v.Mag2();
315 for (
int i = 0; i < 3; i++) {
316 for (
int j = 0; j < 3; j++) {
317 CM(i, j) = -
c1 * u[i] * u[j]
328 Float_t h, hvx, hvz, hvxy, hvxz, hvyz;
336 CM(0, 0) =
e + hvx *
v.fX;
337 CM(0, 1) = hvxy -
v.fZ;
338 CM(0, 2) = hvxz +
v.fY;
340 CM(1, 0) = hvxy +
v.fZ;
341 CM(1, 1) =
e +
h *
v.fY *
v.fY;
342 CM(1, 2) = hvyz -
v.fX;
344 CM(2, 0) = hvxz -
v.fY;
345 CM(2, 1) = hvyz +
v.fX;
346 CM(2, 2) =
e + hvz *
v.fZ;
357 for(
int c=0;
c<4; ++
c, col+=4) {
359 for(
int r=0;
r<4; ++
r, ++row)
360 buf[
r] = row[0]*col[0] + row[4]*col[1] + row[8]*col[2] + row[12]*col[3];
361 col[0] = buf[0]; col[1] = buf[1]; col[2] = buf[2]; col[3] = buf[3];
373 for(
int r=0;
r<4; ++
r, ++row) {
375 for(
int c=0;
c<4; ++
c, col+=4)
376 buf[
c] = row[0]*col[0] + row[4]*col[1] + row[8]*col[2] + row[12]*col[3];
377 row[0] = buf[0]; row[4] = buf[1]; row[8] = buf[2]; row[12] = buf[3];
411 fM[
F03] += amount*col[0];
fM[
F13] += amount*col[1];
fM[
F23] += amount*col[2];
435 --i1 <<= 2; --i2 <<= 2;
436 for (
int r=0;
r<4; ++
r, ++row) {
437 b1 = cos*row[i1] + sin*row[i2];
438 b2 = cos*row[i2] - sin*row[i1];
439 row[i1] = b1; row[i2] = b2;
449 fM[
F03 + --ai] += amount;
475 for(
int c=0;
c<4; ++
c, col+=4) {
476 b1 = cos*col[i1] - sin*col[i2];
477 b2 = cos*col[i2] + sin*col[i1];
478 col[i1] = b1; col[i2] = b2;
489 fM[
F03] += amount*vec[0];
490 fM[
F13] += amount*vec[1];
491 fM[
F23] += amount*vec[2];
526 col[0] =
x; col[1] =
y; col[2] = z;
553 v.SetXYZ(col[0], col[1], col[2]);
629 clamp_angle(a1); clamp_angle(a2); clamp_angle(a3);
657 int n = strspn(pat,
"XxYyZz");
if(
n > 3)
n = 3;
661 for(
int i=0; i<
n; i++) {
662 if(isupper(pat[i]))
a[i] = -
a[i];
664 case 'x':
case 'X':
RotateLF(2, 3,
a[i]);
break;
665 case 'y':
case 'Y':
RotateLF(3, 1,
a[i]);
break;
666 case 'z':
case 'Z':
RotateLF(1, 2,
a[i]);
break;
681 if(
d>1)
d=1;
else if(
d<-1)
d=-1;
713 return (sx + sy + sz)/3;
881 c[0] /=
l;
c[1] /=
l;
c[2] /=
l;
892 const Double_t dp =
c[0]*rc[0] +
c[1]*rc[1] +
c[2]*rc[2];
893 c[0] -= rc[0]*dp;
c[1] -= rc[1]*dp;
c[2] -= rc[2]*dp;
962 throw(eh +
"matrix is singular.");
965 const Double_t oneOverDet = 1.0/det;
966 const Double_t mn1OverDet = - oneOverDet;
968 fM[
F00] = det3_123_123 * oneOverDet;
969 fM[
F01] = det3_023_123 * mn1OverDet;
970 fM[
F02] = det3_013_123 * oneOverDet;
971 fM[
F03] = det3_012_123 * mn1OverDet;
973 fM[
F10] = det3_123_023 * mn1OverDet;
974 fM[
F11] = det3_023_023 * oneOverDet;
975 fM[
F12] = det3_013_023 * mn1OverDet;
976 fM[
F13] = det3_012_023 * oneOverDet;
978 fM[
F20] = det3_123_013 * oneOverDet;
979 fM[
F21] = det3_023_013 * mn1OverDet;
980 fM[
F22] = det3_013_013 * oneOverDet;
981 fM[
F23] = det3_012_013 * mn1OverDet;
983 fM[
F30] = det3_123_012 * mn1OverDet;
984 fM[
F31] = det3_023_012 * oneOverDet;
985 fM[
F32] = det3_013_012 * mn1OverDet;
986 fM[
F33] = det3_012_012 * oneOverDet;
1011 for(
Int_t i=0; i<4; ++i, ++row)
1012 printf(
"%8.3f %8.3f %8.3f | %8.3f\n", row[0], row[4], row[8], row[12]);
1022 s.setf(std::ios::fixed, std::ios::floatfield);
1024 for(
Int_t i=1; i<=4; i++)
1025 for(
Int_t j=1; j<=4; j++)
1026 s << t(i,j) << ((j==4) ?
"\n" :
"\t");
1054 m[0] =
r[0]*s[0];
m[1] =
r[3]*s[0];
m[2] =
r[6]*s[0];
m[3] = 0;
1055 m[4] =
r[1]*s[1];
m[5] =
r[4]*s[1];
m[6] =
r[7]*s[1];
m[7] = 0;
1056 m[8] =
r[2]*s[2];
m[9] =
r[5]*s[2];
m[10] =
r[8]*s[2];
m[11] = 0;
1057 m[12] = t[0];
m[13] = t[1];
m[14] = t[2];
m[15] = 1;
1061 m[0] =
r[0];
m[1] =
r[3];
m[2] =
r[6];
m[3] = 0;
1062 m[4] =
r[1];
m[5] =
r[4];
m[6] =
r[7];
m[7] = 0;
1063 m[8] =
r[2];
m[9] =
r[5];
m[10] =
r[8];
m[11] = 0;
1064 m[12] = t[0];
m[13] = t[1];
m[14] = t[2];
m[15] = 1;
1082 r[0] =
m[0]/s[0];
r[3] =
m[1]/s[0];
r[6] =
m[2]/s[0];
m += 4;
1083 r[1] =
m[0]/s[1];
r[4] =
m[1]/s[1];
r[7] =
m[2]/s[1];
m += 4;
1084 r[2] =
m[0]/s[2];
r[5] =
m[1]/s[2];
r[8] =
m[2]/s[2];
m += 4;
1085 t[0] =
m[0]; t[1] =
m[1]; t[2] =
m[2];
1090 r[0] = 1;
r[3] = 0;
r[6] = 0;
1091 r[1] = 0;
r[4] = 1;
r[7] = 0;
1092 r[2] = 0;
r[5] = 0;
r[8] = 1;
1093 s[0] = s[1] = s[2] = 1;
1094 t[0] = t[1] = t[2] = 0;
1109 m[0] =
fM[0];
m[1] =
fM[4];
m[2] =
fM[8];
m[3] =
fM[3];
1110 m[4] =
fM[1];
m[5] =
fM[5];
m[6] =
fM[9];
m[7] =
fM[7];
1111 m[8] =
fM[2];
m[9] =
fM[6];
m[10] =
fM[10];
m[11] =
fM[11];
1112 m[12] =
fM[12];
m[13] =
fM[13];
m[14] =
fM[14];
m[15] =
fM[15];
1131 if (s < low || s > high)
return kTRUE;
1133 if (s < low || s > high)
return kTRUE;
1135 if (s < low || s > high)
return kTRUE;
const char Option_t
Option string (const char)
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t r
REveException Exception-type thrown by Eve classes.
REveTrans operator*(const REveTrans &t)
Copy, multiply from right and return product.
void UnitRot()
Reset rotation part of the matrix to unity.
void SetBuffer3D(TBuffer3D &buff)
Fill transformation part TBuffer3D core section.
void SetupRotation(Int_t i, Int_t j, Double_t f)
Setup the matrix as an elementary rotation.
Double_t Norm3Column(Int_t col)
Norm 3-vector in column col.
void SetScaleY(Double_t sy)
Change y scaling.
void RotatePF(Int_t i1, Int_t i2, Double_t amount)
Rotate in parent frame. Does optimised version of MultLeft.
Double_t Invert()
Invert matrix.
void MultiplyIP(TVector3 &v, Double_t w=1) const
Multiply vector in-place.
void RotateLF(Int_t i1, Int_t i2, Double_t amount)
Rotate in local frame. Does optimised version of MultRight.
std::unique_ptr< REveDeltaTrans > fDeltaTrans
Streamed motion, null unless set.
void SetMotion(const REveVectorD &vel, const REveVectorD &acc, Double_t max_dt)
Declare how this transformation is changing; position still comes from the matrix.
void GetScale(Double_t &sx, Double_t &sy, Double_t &sz) const
Deduce scales from sizes of base vectors.
REveTrans()
Default constructor.
void TransposeRotationPart()
Transpose 3x3 rotation sub-matrix.
void ZeroTrans(Double_t w=1.0)
Reset matrix to zero, only the perspective scaling is set to w (1 by default).
void Move3PF(Double_t x, Double_t y, Double_t z)
General move in parent-frame.
void SetTrans(const REveTrans &t, Bool_t copyAngles=kTRUE)
Set matrix from another,.
void SetFromArray(const Double_t arr[16])
Set matrix from Double_t array.
void MovePF(Int_t ai, Double_t amount)
Move in parent-frame along axis index ai.
void SetBaseVec(Int_t b, Double_t x, Double_t y, Double_t z)
Set base-vector with index b.
void SetScaleX(Double_t sx)
Change x scaling.
void MoveLF(Int_t ai, Double_t amount)
Move in local-frame along axis with index ai.
Double_t Orto3Column(Int_t col, Int_t ref)
Orto-norm 3-vector in column col with respect to column ref.
void SetGeoHMatrix(TGeoHMatrix &mat)
Set TGeoHMatrix mat.
void SetScale(Double_t sx, Double_t sy, Double_t sz)
Set scaling.
void OrtoNorm3()
Orto-norm columns 1 to 3.
void Move(const REveTrans &a, Int_t ai, Double_t amount)
Move in a's coord-system along axis-index ai.
void SetFrom(Double_t *carr)
void Move3LF(Double_t x, Double_t y, Double_t z)
General move in local-frame.
void GetRotAngles(Float_t *x) const
Get Cardan rotation angles (pattern xYz above).
void SetupFromToVec(const REveVector &from, const REveVector &to)
A function for creating a rotation matrix that rotates a vector called "from" into another vector cal...
Double_t CM(Int_t i, Int_t j) const
void Print(Option_t *option="") const override
Print in reasonable format.
TVector3 Multiply(const TVector3 &v, Double_t w=1) const
Multiply vector and return it.
void SetPos(Double_t x, Double_t y, Double_t z)
Set position (base-vec 4).
void Scale(Double_t sx, Double_t sy, Double_t sz)
Scale matrix. Translation part untouched.
void UnitTrans()
Reset matrix to unity.
Bool_t IsScale(Double_t low=0.9, Double_t high=1.1) const
Test if the transformation is a scale.
void Move3(const REveTrans &a, Double_t x, Double_t y, Double_t z)
General move in a's coord-system.
void RotateIP(TVector3 &v) const
Rotate vector in-place. Translation is NOT applied.
void MultRight(const REveTrans &t)
Multiply from right: this = this * t.
void ClearMotion()
Stop extrapolating: the element holds wherever the matrix puts it.
Double_t Unscale()
Remove scaling, make all base vectors of unit length.
void SetScaleZ(Double_t sz)
Change z scaling.
void SetRotByAnyAngles(Float_t a1, Float_t a2, Float_t a3, const char *pat)
Sets Rotation part as given by angles a1, a1, a3 and pattern pat.
void SetRotByAngles(Float_t a1, Float_t a2, Float_t a3)
void MultLeft(const REveTrans &t)
Multiply from left: this = t * this.
TVector3 GetBaseVec(Int_t b) const
Get base-vector with index b.
void Rotate(const REveTrans &a, Int_t i1, Int_t i2, Double_t amount)
Rotate in a's coord-system, rotating base vector with index i1 into i2.
static double ServerTimeMs()
Milliseconds from a monotonic clock, counted from first use.
REveVectorT Cross(const REveVectorT &a) const
REveVectorT & Sub(const REveVectorT &a, const REveVectorT &b)
TT Dot(const REveVectorT &a) const
Generic 3D primitive description class.
Double_t fLocalMaster[16]
Buffer base class used for serializing objects.
Int_t ReadBuffer(TBuffer &b, void *pointer, Int_t version, UInt_t start, UInt_t count)
Function called by the Streamer functions to deserialize information from buffer b into object at p.
Int_t WriteBuffer(TBuffer &b, void *pointer, const char *info="")
Function called by the Streamer functions to serialize object at p to buffer b.
Matrix class used for computing global transformations Should NOT be used for node definition.
const Double_t * GetScale() const override
const Double_t * GetRotationMatrix() const override
const Double_t * GetTranslation() const override
Geometrical transformation package.
virtual const Double_t * GetTranslation() const =0
virtual const Double_t * GetScale() const =0
virtual const Double_t * GetRotationMatrix() const =0
Mother of all ROOT objects.
virtual void Streamer(TBuffer &)
Stream an object of class TObject.
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
void SetXYZ(Double_t x, Double_t y, Double_t z)
Namespace for ROOT features in testing.
std::ostream & operator<<(std::ostream &s, const REveTrans &t)
REveVectorT< Double_t > REveVectorD
Double_t ASin(Double_t)
Returns the principal value of the arc sine of x, expressed in radians.
Double_t ATan2(Double_t y, Double_t x)
Returns the principal value of the arc tangent of y/x, expressed in radians.
Double_t Sqrt(Double_t x)
Returns the square root of x.
Double_t Cos(Double_t)
Returns the cosine of an angle of x radians.
Double_t Sin(Double_t)
Returns the sine of an angle of x radians.
Short_t Abs(Short_t d)
Returns the absolute value of parameter Short_t d.
constexpr Double_t TwoPi()
How a transformation is changing: the state REveTrans::SetMotion() records.