Geant4  10.01.p02
UTrap.icc
Go to the documentation of this file.
1 //
2 // ********************************************************************
3 // * This Software is part of the AIDA Unified Solids Library package *
4 // * See: https://aidasoft.web.cern.ch/USolids *
5 // ********************************************************************
6 //
7 // $Id:$
8 //
9 // --------------------------------------------------------------------
10 //
11 // UTrap.icc
12 //
13 // Implementation of inline methods of UTrap
14 //
15 // 12.02.13 Marek Gayer
16 // Created from original implementation in Geant4
17 // --------------------------------------------------------------------
18 
19 inline
20 double UTrap::GetZHalfLength() const
21 {
22  return fDz ;
23 }
24 
25 inline
26 UVector3 UTrap::GetSymAxis() const
27 {
28  double cosTheta = 1.0 / std::sqrt(1 + fTthetaCphi * fTthetaCphi +
29  fTthetaSphi * fTthetaSphi) ;
30 
31  return UVector3(fTthetaCphi * cosTheta,
32  fTthetaSphi * cosTheta,
33  cosTheta) ;
34 }
35 
36 inline
37 double UTrap::GetYHalfLength1() const
38 {
39  return fDy1 ;
40 }
41 
42 inline
43 double UTrap::GetXHalfLength1() const
44 {
45  return fDx1 ;
46 }
47 
48 inline
49 double UTrap::GetXHalfLength2() const
50 {
51  return fDx2 ;
52 }
53 
54 inline
55 double UTrap::GetTanAlpha1() const
56 {
57  return fTalpha1 ;
58 }
59 
60 inline
61 double UTrap::GetYHalfLength2() const
62 {
63  return fDy2 ;
64 }
65 
66 inline
67 double UTrap::GetXHalfLength3() const
68 {
69  return fDx3 ;
70 }
71 
72 inline
73 double UTrap::GetXHalfLength4() const
74 {
75  return fDx4 ;
76 }
77 
78 inline
79 double UTrap::GetTanAlpha2() const
80 {
81  return fTalpha2 ;
82 }
83 
84 inline
85 double UTrap::GetThetaCphi() const
86 {
87  return fTthetaCphi ;
88 }
89 
90 inline
91 double UTrap::GetThetaSphi() const
92 {
93  return fTthetaSphi ;
94 }
95 
96 inline
97 UTrapSidePlane UTrap::GetSidePlane(int n) const
98 {
99  return fPlanes[n] ;
100 }
101 
102 inline
103 double UTrap::GetFaceArea(const UVector3& p0, const UVector3& p1,
104  const UVector3& p2, const UVector3& p3)
105 {
106  double area = 0.5 * ((p1 - p0).Cross(p2 - p1).Mag() + (p3 - p2).Cross(p0 - p3).Mag());
107  return area;
108 }
109 
110 inline
111 double UTrap::Capacity()
112 {
113  if (fCubicVolume != 0.)
114  {
115  ;
116  }
117  else
118  {
119  fCubicVolume = fDz * ((fDx1 + fDx2 + fDx3 + fDx4) * (fDy1 + fDy2)
120  + (fDx4 + fDx3 - fDx2 - fDx1) * (fDy2 - fDy1) / 3);
121  }
122  return fCubicVolume;
123 }
124 
125 inline
126 double UTrap::SurfaceArea()
127 {
128  if (fSurfaceArea != 0.)
129  {
130  ;
131  }
132  else
133  {
134  UVector3 ba(fDx1 - fDx2 + fTalpha1 * 2 * fDy1, 2 * fDy1, 0);
135  UVector3 bc(2 * fDz * fTthetaCphi - (fDx4 - fDx2) + fTalpha2 * fDy2 - fTalpha1 * fDy1,
136  2 * fDz * fTthetaSphi + fDy2 - fDy1, 2 * fDz);
137  UVector3 dc(-fDx4 + fDx3 + 2 * fTalpha2 * fDy2, 2 * fDy2, 0);
138  UVector3 da(-2 * fDz * fTthetaCphi - (fDx1 - fDx3) - fTalpha1 * fDy1 + fTalpha2 * fDy2,
139  -2 * fDz * fTthetaSphi - fDy1 + fDy2, -2 * fDz);
140 
141  UVector3 ef(fDx2 - fDx1 + 2 * fTalpha1 * fDy1, 2 * fDy1, 0);
142  UVector3 eh(2 * fDz * fTthetaCphi + fDx3 - fDx1 + fTalpha1 * fDy1 - fTalpha2 * fDy2,
143  2 * fDz * fTthetaSphi - fDy2 + fDy1, 2 * fDz);
144  UVector3 gh(fDx3 - fDx4 - 2 * fTalpha2 * fDy2, -2 * fDy2, 0);
145  UVector3 gf(-2 * fDz * fTthetaCphi + fDx2 - fDx4 + fTalpha1 * fDy1 - fTalpha2 * fDy2,
146  -2 * fDz * fTthetaSphi + fDy1 - fDy2, -2 * fDz);
147 
148  UVector3 cr;
149  cr = ba.Cross(bc);
150  double babc = cr.Mag();
151  cr = dc.Cross(da);
152  double dcda = cr.Mag();
153  cr = ef.Cross(eh);
154  double efeh = cr.Mag();
155  cr = gh.Cross(gf);
156  double ghgf = cr.Mag();
157 
158  fSurfaceArea = 2 * fDy1 * (fDx1 + fDx2) + 2 * fDy2 * (fDx3 + fDx4)
159  + (fDx1 + fDx3)
160  * std::sqrt(4 * fDz * fDz + std::pow(fDy2 - fDy1 - 2 * fDz * fTthetaSphi, 2))
161  + (fDx2 + fDx4)
162  * std::sqrt(4 * fDz * fDz + std::pow(fDy2 - fDy1 + 2 * fDz * fTthetaSphi, 2))
163  + 0.5 * (babc + dcda + efeh + ghgf);
164  }
165  return fSurfaceArea;
166 }