ROOT logo
// $Id: ZTrans.h 2341 2010-01-24 01:28:32Z matevz $

// Copyright (C) 1999-2008, Matevz Tadel. All rights reserved.
// This file is part of GLED, released under GNU General Public License version 2.
// For the licensing terms see $GLEDSYS/LICENSE or http://www.gnu.org/.

#ifndef GledCore_ZTrans_H
#define GledCore_ZTrans_H

#include <TVector3.h>

class ZNode;

/**************************************************************************/
// ZTrans -- 3D transformation in generalised coordinates
/**************************************************************************/

class ZTrans : public TObject
{
protected:
  Double32_t            M[16];

  mutable Float_t	mA1;   //!
  mutable Float_t	mA2;   //!
  mutable Float_t	mA3;   //!
  mutable Bool_t	bAsOK; //!

public:
  ZTrans();
  ZTrans(const ZTrans& z);
  ZTrans(const ZNode* n);
  ZTrans(const Double_t arr[16]);
  ZTrans(const Float_t  arr[16]);
  virtual ~ZTrans() {}

  // General operations

  void     UnitTrans();
  void     UnitRot();
  void     SetTrans(const ZTrans& t);
  void     SetFromArray(const Double_t arr[16]);
  void     SetFromArray(const Float_t  arr[16]);
  ZTrans&  operator=(const ZTrans& t) { SetTrans(t); return *this; }
  void     SetupRotation(Int_t i, Int_t j, Double_t f);

  Double_t Norm3Column(Int_t col);
  Double_t Orto3Column(Int_t col, Int_t ref);
  Double_t OrtoNorm3Column(Int_t col, Int_t ref);
  void     OrtoNorm3();
  void     SetBaseVecViaCross(Int_t i);
  Double_t Invert();

  void MultLeft(const ZTrans& t);
  void MultRight(const ZTrans& t);
  void operator*=(const ZTrans& t) { MultRight(t); }

  void TransposeRotationPart();

  ZTrans operator*(const ZTrans& t);

  // Move & Rotate

  void MoveLF(Int_t ai, Double_t amount);
  void Move3LF(Double_t x, Double_t y, Double_t z);
  void RotateLF(Int_t i1, Int_t i2, Double_t amount);

  void MovePF(Int_t ai, Double_t amount);
  void Move3PF(Double_t x, Double_t y, Double_t z);
  void RotatePF(Int_t i1, Int_t i2, Double_t amount);

  void Move(const ZTrans& a, Int_t ai, Double_t amount);
  void Move3(const ZTrans& a, Double_t x, Double_t y, Double_t z);
  void Rotate(const ZTrans& a, Int_t i1, Int_t i2, Double_t amount);

  // Element access

  Double_t* Array() { return M; }      const Double_t* Array() const { return M; }
  Double_t* ArrX()  { return M; }      const Double_t* ArrX()  const { return M; }
  Double_t* ArrY()  { return M +  4; } const Double_t* ArrY()  const { return M +  4; }
  Double_t* ArrZ()  { return M +  8; } const Double_t* ArrZ()  const { return M +  8; }
  Double_t* ArrT()  { return M + 12; } const Double_t* ArrT()  const { return M + 12; }

  Double_t  operator[](Int_t i) const { return M[i]; }
  Double_t& operator[](Int_t i)       { return M[i]; }

  Double_t  CM(Int_t i, Int_t j) const { return M[4*j + i]; }
  Double_t& CM(Int_t i, Int_t j)       { return M[4*j + i]; }

  Double_t  operator()(Int_t i, Int_t j) const { return M[4*j + i - 5]; }
  Double_t& operator()(Int_t i, Int_t j)       { return M[4*j + i - 5]; }

  // Base-vector interface

  void SetBaseVec(Int_t b, Double_t x, Double_t y, Double_t z);
  void SetBaseVec(Int_t b, const TVector3& v);
  void SetBaseVec(Int_t b, const Double_t* x);
  void SetBaseVec(Int_t b, const Float_t*  x);

  TVector3 GetBaseVec(Int_t b) const;
  void     GetBaseVec(Int_t b, TVector3& v) const;
  void     GetBaseVec(Int_t b, Double_t* x) const;
  void     GetBaseVec(Int_t b, Float_t*  x) const;

  // Position interface

  void SetPos(Double_t x, Double_t y, Double_t z);
  void SetPos(const Double_t* x);
  void SetPos(const Float_t*  x);
  void SetPos(const ZTrans& t);

  void GetPos(Double_t& x, Double_t& y, Double_t& z) const;
  void GetPos(Double_t* x) const;
  void GetPos(Float_t*  x) const;
  void GetPos(TVector3& v) const;
  TVector3 GetPos() const;

  // Cardan angle interface

  void SetRotByAngles(Float_t a1, Float_t a2, Float_t a3);
  void SetRotByAnyAngles(Float_t a1, Float_t a2, Float_t a3, const Text_t* pat);
  void GetRotAngles(Float_t* x) const;

  Bool_t CompareAngles(Float_t a1, Float_t a2, Float_t a3) const;

  // Scaling

  void     Scale(Double_t sx, Double_t sy, Double_t sz);
  void     GetScale(Double_t& sx, Double_t& sy, Double_t& sz) const;
  void     Unscale(Double_t& sx, Double_t& sy, Double_t& sz);
  Double_t Unscale();


  // Operations on vectors

  void     MultiplyIP(TVector3& v, Double_t w=1) const;
  TVector3 Multiply(const TVector3& v, Double_t w=1) const;
  void     RotateIP(TVector3& v) const;
  TVector3 Rotate(const TVector3& v) const;


  virtual void Print(Option_t* option = "") const;

  ClassDef(ZTrans, 1); // Column-major 4x4 matrix for homogeneous coordinates.
};

ostream& operator<<(ostream& s, const ZTrans& t);


/**************************************************************************/
// Base-vector interface
/**************************************************************************/

inline void ZTrans::SetBaseVec(Int_t b, Double_t x, Double_t y, Double_t z)
{
  Double_t* C = M + 4*--b;
  C[0] = x; C[1] = y; C[2] = z;
  bAsOK = false;
}

inline void ZTrans::SetBaseVec(Int_t b, const TVector3& v)
{
  Double_t* C = M + 4*--b;
  v.GetXYZ(C);
  bAsOK = false;
}

inline void ZTrans::SetBaseVec(Int_t b, const Double_t* x)
{
  Double_t* C = M + 4*--b;
  C[0] = x[0]; C[1] = x[1]; C[2] = x[2];
  bAsOK = false;
}

inline void ZTrans::SetBaseVec(Int_t b, const Float_t* x)
{
  Double_t* C = M + 4*--b;
  C[0] = x[0]; C[1] = x[1]; C[2] = x[2];
  bAsOK = false;
}

inline TVector3 ZTrans::GetBaseVec(Int_t b) const
{ return TVector3(&M[4*--b]); }

inline void ZTrans::GetBaseVec(Int_t b, TVector3& v) const
{
  const Double_t* C = M + 4*--b;
  v.SetXYZ(C[0], C[1], C[2]);
}

inline void ZTrans::GetBaseVec(Int_t b, Double_t* x) const
{
  const Double_t* C = M + 4*--b;
  x[0] = C[0], x[1] = C[1], x[2] = C[2];
}

inline void ZTrans::GetBaseVec(Int_t b, Float_t* x) const
{
  const Double_t* C = M + 4*--b;
  x[0] = C[0], x[1] = C[1], x[2] = C[2];
}

/**************************************************************************/
// Position interface
/**************************************************************************/

inline void ZTrans::SetPos(Double_t x, Double_t y, Double_t z)
{ M[12] = x; M[13] = y; M[14] = z; }

inline void ZTrans::SetPos(const Double_t* x)
{ M[12] = x[0]; M[13] = x[1]; M[14] = x[2]; }

inline void ZTrans::SetPos(const Float_t* x)
{ M[12] = x[0]; M[13] = x[1]; M[14] = x[2]; }

inline void ZTrans::SetPos(const ZTrans& t)
{
  const Double_t* T = t.M;
  M[12] = T[12]; M[13] = T[13]; M[14] = T[14];
}

inline void ZTrans::GetPos(Double_t& x, Double_t& y, Double_t& z) const
{ x = M[12]; y = M[13]; z = M[14]; }

inline void ZTrans::GetPos(Double_t* x) const
{ x[0] = M[12]; x[1] = M[13]; x[2] = M[14]; }

inline void ZTrans::GetPos(Float_t* x) const
{ x[0] = M[12]; x[1] = M[13]; x[2] = M[14]; }

inline void ZTrans::GetPos(TVector3& v) const
{ v.SetXYZ(M[12], M[13], M[14]); }

inline TVector3 ZTrans::GetPos() const
{ return TVector3(M[12], M[13], M[14]); }

#endif
 ZTrans.h:1
 ZTrans.h:2
 ZTrans.h:3
 ZTrans.h:4
 ZTrans.h:5
 ZTrans.h:6
 ZTrans.h:7
 ZTrans.h:8
 ZTrans.h:9
 ZTrans.h:10
 ZTrans.h:11
 ZTrans.h:12
 ZTrans.h:13
 ZTrans.h:14
 ZTrans.h:15
 ZTrans.h:16
 ZTrans.h:17
 ZTrans.h:18
 ZTrans.h:19
 ZTrans.h:20
 ZTrans.h:21
 ZTrans.h:22
 ZTrans.h:23
 ZTrans.h:24
 ZTrans.h:25
 ZTrans.h:26
 ZTrans.h:27
 ZTrans.h:28
 ZTrans.h:29
 ZTrans.h:30
 ZTrans.h:31
 ZTrans.h:32
 ZTrans.h:33
 ZTrans.h:34
 ZTrans.h:35
 ZTrans.h:36
 ZTrans.h:37
 ZTrans.h:38
 ZTrans.h:39
 ZTrans.h:40
 ZTrans.h:41
 ZTrans.h:42
 ZTrans.h:43
 ZTrans.h:44
 ZTrans.h:45
 ZTrans.h:46
 ZTrans.h:47
 ZTrans.h:48
 ZTrans.h:49
 ZTrans.h:50
 ZTrans.h:51
 ZTrans.h:52
 ZTrans.h:53
 ZTrans.h:54
 ZTrans.h:55
 ZTrans.h:56
 ZTrans.h:57
 ZTrans.h:58
 ZTrans.h:59
 ZTrans.h:60
 ZTrans.h:61
 ZTrans.h:62
 ZTrans.h:63
 ZTrans.h:64
 ZTrans.h:65
 ZTrans.h:66
 ZTrans.h:67
 ZTrans.h:68
 ZTrans.h:69
 ZTrans.h:70
 ZTrans.h:71
 ZTrans.h:72
 ZTrans.h:73
 ZTrans.h:74
 ZTrans.h:75
 ZTrans.h:76
 ZTrans.h:77
 ZTrans.h:78
 ZTrans.h:79
 ZTrans.h:80
 ZTrans.h:81
 ZTrans.h:82
 ZTrans.h:83
 ZTrans.h:84
 ZTrans.h:85
 ZTrans.h:86
 ZTrans.h:87
 ZTrans.h:88
 ZTrans.h:89
 ZTrans.h:90
 ZTrans.h:91
 ZTrans.h:92
 ZTrans.h:93
 ZTrans.h:94
 ZTrans.h:95
 ZTrans.h:96
 ZTrans.h:97
 ZTrans.h:98
 ZTrans.h:99
 ZTrans.h:100
 ZTrans.h:101
 ZTrans.h:102
 ZTrans.h:103
 ZTrans.h:104
 ZTrans.h:105
 ZTrans.h:106
 ZTrans.h:107
 ZTrans.h:108
 ZTrans.h:109
 ZTrans.h:110
 ZTrans.h:111
 ZTrans.h:112
 ZTrans.h:113
 ZTrans.h:114
 ZTrans.h:115
 ZTrans.h:116
 ZTrans.h:117
 ZTrans.h:118
 ZTrans.h:119
 ZTrans.h:120
 ZTrans.h:121
 ZTrans.h:122
 ZTrans.h:123
 ZTrans.h:124
 ZTrans.h:125
 ZTrans.h:126
 ZTrans.h:127
 ZTrans.h:128
 ZTrans.h:129
 ZTrans.h:130
 ZTrans.h:131
 ZTrans.h:132
 ZTrans.h:133
 ZTrans.h:134
 ZTrans.h:135
 ZTrans.h:136
 ZTrans.h:137
 ZTrans.h:138
 ZTrans.h:139
 ZTrans.h:140
 ZTrans.h:141
 ZTrans.h:142
 ZTrans.h:143
 ZTrans.h:144
 ZTrans.h:145
 ZTrans.h:146
 ZTrans.h:147
 ZTrans.h:148
 ZTrans.h:149
 ZTrans.h:150
 ZTrans.h:151
 ZTrans.h:152
 ZTrans.h:153
 ZTrans.h:154
 ZTrans.h:155
 ZTrans.h:156
 ZTrans.h:157
 ZTrans.h:158
 ZTrans.h:159
 ZTrans.h:160
 ZTrans.h:161
 ZTrans.h:162
 ZTrans.h:163
 ZTrans.h:164
 ZTrans.h:165
 ZTrans.h:166
 ZTrans.h:167
 ZTrans.h:168
 ZTrans.h:169
 ZTrans.h:170
 ZTrans.h:171
 ZTrans.h:172
 ZTrans.h:173
 ZTrans.h:174
 ZTrans.h:175
 ZTrans.h:176
 ZTrans.h:177
 ZTrans.h:178
 ZTrans.h:179
 ZTrans.h:180
 ZTrans.h:181
 ZTrans.h:182
 ZTrans.h:183
 ZTrans.h:184
 ZTrans.h:185
 ZTrans.h:186
 ZTrans.h:187
 ZTrans.h:188
 ZTrans.h:189
 ZTrans.h:190
 ZTrans.h:191
 ZTrans.h:192
 ZTrans.h:193
 ZTrans.h:194
 ZTrans.h:195
 ZTrans.h:196
 ZTrans.h:197
 ZTrans.h:198
 ZTrans.h:199
 ZTrans.h:200
 ZTrans.h:201
 ZTrans.h:202
 ZTrans.h:203
 ZTrans.h:204
 ZTrans.h:205
 ZTrans.h:206
 ZTrans.h:207
 ZTrans.h:208
 ZTrans.h:209
 ZTrans.h:210
 ZTrans.h:211
 ZTrans.h:212
 ZTrans.h:213
 ZTrans.h:214
 ZTrans.h:215
 ZTrans.h:216
 ZTrans.h:217
 ZTrans.h:218
 ZTrans.h:219
 ZTrans.h:220
 ZTrans.h:221
 ZTrans.h:222
 ZTrans.h:223
 ZTrans.h:224
 ZTrans.h:225
 ZTrans.h:226
 ZTrans.h:227
 ZTrans.h:228
 ZTrans.h:229
 ZTrans.h:230
 ZTrans.h:231
 ZTrans.h:232
 ZTrans.h:233
 ZTrans.h:234
 ZTrans.h:235
 ZTrans.h:236