Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/geometry/solids/Boolean/src/G4DisplacedSolid.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /geometry/solids/Boolean/src/G4DisplacedSolid.cc (Version 11.3.0) and /geometry/solids/Boolean/src/G4DisplacedSolid.cc (Version 4.0.p1)


  1 //                                                  1 //
  2 // *******************************************      2 // ********************************************************************
  3 // * License and Disclaimer                    <<   3 // * DISCLAIMER                                                       *
  4 // *                                                4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of th <<   5 // * The following disclaimer summarizes all the specific disclaimers *
  6 // * the Geant4 Collaboration.  It is provided <<   6 // * of contributors to this software. The specific disclaimers,which *
  7 // * conditions of the Geant4 Software License <<   7 // * govern, are listed with their locations in:                      *
  8 // * LICENSE and available at  http://cern.ch/ <<   8 // *   http://cern.ch/geant4/license                                  *
  9 // * include a list of copyright holders.      << 
 10 // *                                                9 // *                                                                  *
 11 // * Neither the authors of this software syst     10 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing fin     11 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warran     12 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assum     13 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file  <<  14 // * use.                                                             *
 16 // * for the full disclaimer and the limitatio << 
 17 // *                                               15 // *                                                                  *
 18 // * This  code  implementation is the result  <<  16 // * This  code  implementation is the  intellectual property  of the *
 19 // * technical work of the GEANT4 collaboratio <<  17 // * GEANT4 collaboration.                                            *
 20 // * By using,  copying,  modifying or  distri <<  18 // * By copying,  distributing  or modifying the Program (or any work *
 21 // * any work based  on the software)  you  ag <<  19 // * based  on  the Program)  you indicate  your  acceptance of  this *
 22 // * use  in  resulting  scientific  publicati <<  20 // * statement, and all its terms.                                    *
 23 // * acceptance of all terms of the Geant4 Sof << 
 24 // *******************************************     21 // ********************************************************************
 25 //                                                 22 //
 26 // Implementation of G4DisplacedSolid class fo <<  23 //
                                                   >>  24 // $Id: G4DisplacedSolid.cc,v 1.14 2001/07/11 09:59:52 gunter Exp $
                                                   >>  25 // GEANT4 tag $Name: geant4-04-00 $
                                                   >>  26 //
                                                   >>  27 // Implementation for G4DisplacedSolid class for boolean 
 27 // operations between other solids                 28 // operations between other solids
 28 //                                                 29 //
 29 // 28.10.98 V.Grichine: created                <<  30 // History:
 30 // 28.02.18 E.Tcherniaev: improved contruction <<  31 //
 31 // ------------------------------------------- <<  32 // 28.10.98 V.Grichine, creation according J. Apostolakis's recommendations
                                                   >>  33 // 14.11.99 V.Grichine, modifications in CalculateExtent(...) method
                                                   >>  34 // 22.11.00 V.Grichine, new set methods for matrix/vectors
 32                                                    35 
 33 #include "G4DisplacedSolid.hh"                     36 #include "G4DisplacedSolid.hh"
 34                                                    37 
                                                   >>  38 
 35 #include "G4VoxelLimits.hh"                        39 #include "G4VoxelLimits.hh"
                                                   >>  40 #include "G4AffineTransform.hh"
 36                                                    41 
 37 #include "G4VPVParameterisation.hh"                42 #include "G4VPVParameterisation.hh"
 38                                                    43 
 39 #include "G4VGraphicsScene.hh"                     44 #include "G4VGraphicsScene.hh"
 40 #include "G4Polyhedron.hh"                         45 #include "G4Polyhedron.hh"
                                                   >>  46 #include "G4NURBS.hh"
                                                   >>  47 #include "G4NURBSbox.hh"
 41                                                    48 
 42 //////////////////////////////////////////////     49 ////////////////////////////////////////////////////////////////
 43 //                                                 50 //
 44 // Constructor for transformation like rotatio <<  51 // Constractor for transformation like rotation of frame then translation 
 45 // in new frame. It is similar to 1st constrac     52 // in new frame. It is similar to 1st constractor in G4PVPlacement
 46                                                    53 
 47 G4DisplacedSolid::G4DisplacedSolid( const G4St <<  54 G4DisplacedSolid::
 48                                           G4VS <<  55 G4DisplacedSolid( const G4String& pName,
 49                                           G4Ro <<  56                      G4VSolid* pSolid ,
 50                                     const G4Th <<  57                      G4RotationMatrix* rotMatrix,
 51   : G4VSolid(pName)                            <<  58                const G4ThreeVector& transVector    )
 52 {                                              <<  59    : G4VSolid(pName)
 53   if (pSolid->GetEntityType() == "G4DisplacedS <<  60 {
 54   {                                            <<  61   fPtrSolid = pSolid ;
 55     fPtrSolid = ((G4DisplacedSolid*)pSolid)->G <<  62   fPtrTransform = new G4AffineTransform(rotMatrix,transVector) ;
 56     G4AffineTransform t1 = ((G4DisplacedSolid* <<  63   fPtrTransform->Invert() ;
 57     G4AffineTransform t2 = G4AffineTransform(r <<  64   fDirectTransform = new G4AffineTransform(rotMatrix,transVector) ;
 58     fDirectTransform = new G4AffineTransform(t << 
 59   }                                            << 
 60   else                                         << 
 61   {                                            << 
 62     fPtrSolid = pSolid;                        << 
 63     fDirectTransform = new G4AffineTransform(r << 
 64   }                                            << 
 65   fPtrTransform = new G4AffineTransform(fDirec << 
 66 }                                                  65 }
 67                                                    66 
 68 //////////////////////////////////////////////     67 /////////////////////////////////////////////////////////////////////////////////
 69 //                                                 68 //
 70 // Constructor                                 << 
 71                                                << 
 72 G4DisplacedSolid::G4DisplacedSolid( const G4St << 
 73                                           G4VS << 
 74                                     const G4Tr << 
 75   : G4VSolid(pName)                            << 
 76 {                                              << 
 77   if (pSolid->GetEntityType() == "G4DisplacedS << 
 78   {                                            << 
 79     fPtrSolid = ((G4DisplacedSolid*)pSolid)->G << 
 80     G4AffineTransform t1 = ((G4DisplacedSolid* << 
 81     G4AffineTransform t2 = G4AffineTransform(t << 
 82                                              t << 
 83     fDirectTransform = new G4AffineTransform(t << 
 84   }                                            << 
 85   else                                         << 
 86   {                                            << 
 87     fPtrSolid = pSolid;                        << 
 88     fDirectTransform = new G4AffineTransform(t << 
 89                                              t << 
 90   }                                            << 
 91   fPtrTransform = new G4AffineTransform(fDirec << 
 92 }                                              << 
 93                                                << 
 94 ////////////////////////////////////////////// << 
 95 //                                                 69 //
 96 // Constructor for use with creation of Transi << 
 97 // from Persistent object                      << 
 98                                                << 
 99 G4DisplacedSolid::G4DisplacedSolid( const G4St     70 G4DisplacedSolid::G4DisplacedSolid( const G4String& pName,
100                                           G4VS     71                                           G4VSolid* pSolid ,
101                                     const G4Af <<  72                   const G4Transform3D& transform  ) :
102   : G4VSolid(pName)                            <<  73   G4VSolid(pName)
103 {                                                  74 {
104   if (pSolid->GetEntityType() == "G4DisplacedS <<  75   fPtrSolid = pSolid ;
105   {                                            <<  76   fDirectTransform = new G4AffineTransform(transform.getRotation().inverse(),
106     fPtrSolid = ((G4DisplacedSolid*)pSolid)->G <<  77                                            transform.getTranslation()) ;
107     G4AffineTransform t1 = ((G4DisplacedSolid* <<  78 
108     auto  t2 = G4AffineTransform(directTransfo <<  79   fPtrTransform    = new G4AffineTransform(transform.getRotation().inverse(),
109     fDirectTransform = new G4AffineTransform(t <<  80                                            transform.getTranslation()) ;
110   }                                            <<  81   fPtrTransform->Invert() ;
111   else                                         << 
112   {                                            << 
113     fPtrSolid = pSolid;                        << 
114     fDirectTransform = new G4AffineTransform(d << 
115   }                                            << 
116   fPtrTransform = new G4AffineTransform(fDirec << 
117 }                                                  82 }
118                                                    83 
119 ////////////////////////////////////////////// <<  84 /////////////////////////////////////////////////////////////////////////////////
                                                   >>  85 //  Constructor for use with creation of Transient object from Persistent object
120 //                                                 86 //
121 // Fake default constructor - sets only member << 
122 //                            for usage restri << 
123                                                    87 
124 G4DisplacedSolid::G4DisplacedSolid( __void__&  <<  88 G4DisplacedSolid::G4DisplacedSolid( const G4String& pName,
125   : G4VSolid(a)                                <<  89                                     G4VSolid* pSolid ,
126 {                                              <<  90             const G4AffineTransform directTransform ) :
                                                   >>  91   G4VSolid(pName)
                                                   >>  92 {
                                                   >>  93   fPtrSolid = pSolid ;
                                                   >>  94   fDirectTransform = new G4AffineTransform( directTransform );
                                                   >>  95   fPtrTransform    = new G4AffineTransform( directTransform.Inverse() ) ; 
127 }                                                  96 }
128                                                    97 
129 //////////////////////////////////////////////     98 ///////////////////////////////////////////////////////////////////
130 //                                                 99 //
131 // Destructor                                  << 
132                                                   100 
133 G4DisplacedSolid::~G4DisplacedSolid()             101 G4DisplacedSolid::~G4DisplacedSolid() 
134 {                                                 102 {
135   CleanTransformations();                      << 103   if(fPtrTransform)
136   delete fpPolyhedron; fpPolyhedron = nullptr; << 
137 }                                              << 
138                                                << 
139 ////////////////////////////////////////////// << 
140 //                                             << 
141 // Copy constructor                            << 
142                                                << 
143 G4DisplacedSolid::G4DisplacedSolid(const G4Dis << 
144   : G4VSolid (rhs), fPtrSolid(rhs.fPtrSolid)   << 
145 {                                              << 
146   fPtrTransform = new G4AffineTransform(*(rhs. << 
147   fDirectTransform = new G4AffineTransform(*(r << 
148 }                                              << 
149                                                << 
150 ////////////////////////////////////////////// << 
151 //                                             << 
152 // Assignment operator                         << 
153                                                << 
154 G4DisplacedSolid& G4DisplacedSolid::operator = << 
155 {                                              << 
156   // Check assignment to self                  << 
157   //                                           << 
158   if (this == &rhs)  { return *this; }         << 
159                                                << 
160   // Copy base class data                      << 
161   //                                           << 
162   G4VSolid::operator=(rhs);                    << 
163                                                << 
164   // Copy data                                 << 
165   //                                           << 
166   fPtrSolid = rhs.fPtrSolid;                   << 
167   delete fPtrTransform; delete fDirectTransfor << 
168   fPtrTransform = new G4AffineTransform(*(rhs. << 
169   fDirectTransform = new G4AffineTransform(*(r << 
170   fRebuildPolyhedron = false;                  << 
171   delete fpPolyhedron; fpPolyhedron = nullptr; << 
172                                                << 
173   return *this;                                << 
174 }                                              << 
175                                                << 
176 void G4DisplacedSolid::CleanTransformations()  << 
177 {                                              << 
178   if(fPtrTransform != nullptr)                 << 
179   {                                               104   {
180     delete fPtrTransform; fPtrTransform = null << 105    delete fPtrTransform ;
181     delete fDirectTransform; fDirectTransform  << 106    delete fDirectTransform;
182   }                                               107   }
183 }                                                 108 }
184                                                   109 
185 const G4DisplacedSolid* G4DisplacedSolid::GetD << 110 G4GeometryType G4DisplacedSolid::GetEntityType() const 
186 {                                                 111 {
187   return this;                                 << 112    return G4String("G4DisplacedSolid");
188 }                                                 113 }
189                                                   114 
190 G4DisplacedSolid* G4DisplacedSolid::GetDisplac << 115 const G4DisplacedSolid* G4DisplacedSolid::GetDisplacedSolidPtr() const   
191 {                                              << 116 { return this; }
192   return this;                                 << 117 
193 }                                              << 118       G4DisplacedSolid* G4DisplacedSolid::GetDisplacedSolidPtr() 
                                                   >> 119 { return this; }
194                                                   120 
195 G4VSolid* G4DisplacedSolid::GetConstituentMove    121 G4VSolid* G4DisplacedSolid::GetConstituentMovedSolid() const
196 {                                                 122 { 
197   return fPtrSolid;                               123   return fPtrSolid; 
198 }                                                 124 } 
199                                                   125 
200 //////////////////////////////////////////////    126 /////////////////////////////////////////////////////////////////////////////
201                                                   127 
202 G4AffineTransform  G4DisplacedSolid::GetTransf    128 G4AffineTransform  G4DisplacedSolid::GetTransform() const
203 {                                                 129 {
204   G4AffineTransform aTransform = *fPtrTransfor << 130    G4AffineTransform aTransform = *fPtrTransform;
205   return aTransform;                           << 131    return aTransform;
206 }                                                 132 }
207                                                   133 
208 void G4DisplacedSolid::SetTransform(G4AffineTr    134 void G4DisplacedSolid::SetTransform(G4AffineTransform& transform) 
209 {                                                 135 {
210   fPtrTransform = &transform ;                 << 136    fPtrTransform = &transform ;
211   fRebuildPolyhedron = true;                   << 
212 }                                                 137 }
213                                                   138 
214 //////////////////////////////////////////////    139 //////////////////////////////////////////////////////////////////////////////
215                                                   140 
216 G4AffineTransform  G4DisplacedSolid::GetDirect    141 G4AffineTransform  G4DisplacedSolid::GetDirectTransform() const
217 {                                                 142 {
218   G4AffineTransform aTransform= *fDirectTransf << 143    G4AffineTransform aTransform= *fDirectTransform;
219   return aTransform;                           << 144    return aTransform;
220 }                                                 145 }
221                                                   146 
222 void G4DisplacedSolid::SetDirectTransform(G4Af    147 void G4DisplacedSolid::SetDirectTransform(G4AffineTransform& transform) 
223 {                                                 148 {
224   fDirectTransform = &transform ;              << 149    fDirectTransform = &transform ;
225   fRebuildPolyhedron = true;                   << 
226 }                                                 150 }
227                                                   151 
228 //////////////////////////////////////////////    152 /////////////////////////////////////////////////////////////////////////////
229                                                   153 
230 G4RotationMatrix G4DisplacedSolid::GetFrameRot    154 G4RotationMatrix G4DisplacedSolid::GetFrameRotation() const
231 {                                                 155 {
232   G4RotationMatrix InvRotation = fDirectTransf << 156    G4RotationMatrix InvRotation= fDirectTransform->NetRotation();
233   return InvRotation;                          << 157    return InvRotation;
234 }                                                 158 }
235                                                   159 
236 void G4DisplacedSolid::SetFrameRotation(const     160 void G4DisplacedSolid::SetFrameRotation(const G4RotationMatrix& matrix)
237 {                                                 161 {
238   fDirectTransform->SetNetRotation(matrix);    << 162    fDirectTransform->SetNetRotation(matrix);
239   fRebuildPolyhedron = true;                   << 
240 }                                                 163 }
241                                                   164 
242 //////////////////////////////////////////////    165 /////////////////////////////////////////////////////////////////////////////
243                                                   166 
244 G4ThreeVector  G4DisplacedSolid::GetFrameTrans    167 G4ThreeVector  G4DisplacedSolid::GetFrameTranslation() const
245 {                                                 168 {
246   return fPtrTransform->NetTranslation();      << 169    return fPtrTransform->NetTranslation();
247 }                                                 170 }
248                                                   171 
249 void G4DisplacedSolid::SetFrameTranslation(con    172 void G4DisplacedSolid::SetFrameTranslation(const G4ThreeVector& vector)
250 {                                                 173 {
251   fPtrTransform->SetNetTranslation(vector);       174   fPtrTransform->SetNetTranslation(vector);
252   fRebuildPolyhedron = true;                   << 
253 }                                                 175 }
254                                                   176 
255 //////////////////////////////////////////////    177 ///////////////////////////////////////////////////////////////
256                                                   178 
257 G4RotationMatrix G4DisplacedSolid::GetObjectRo    179 G4RotationMatrix G4DisplacedSolid::GetObjectRotation() const
258 {                                                 180 {
259   G4RotationMatrix Rotation = fPtrTransform->N << 181    G4RotationMatrix Rotation= fPtrTransform->NetRotation();
260   return Rotation;                             << 182    return Rotation;
261 }                                                 183 }
262                                                   184 
263 void G4DisplacedSolid::SetObjectRotation(const    185 void G4DisplacedSolid::SetObjectRotation(const G4RotationMatrix& matrix)
264 {                                                 186 {
265   fPtrTransform->SetNetRotation(matrix);       << 187    fPtrTransform->SetNetRotation(matrix);
266   fRebuildPolyhedron = true;                   << 
267 }                                                 188 }
268                                                   189 
269 //////////////////////////////////////////////    190 ///////////////////////////////////////////////////////////////////////
270                                                   191 
271 G4ThreeVector  G4DisplacedSolid::GetObjectTran    192 G4ThreeVector  G4DisplacedSolid::GetObjectTranslation() const
272 {                                                 193 {
273   return fDirectTransform->NetTranslation();   << 194    return fDirectTransform->NetTranslation();
274 }                                                 195 }
275                                                   196 
276 void G4DisplacedSolid::SetObjectTranslation(co    197 void G4DisplacedSolid::SetObjectTranslation(const G4ThreeVector& vector)
277 {                                                 198 {
278   fDirectTransform->SetNetTranslation(vector);    199   fDirectTransform->SetNetTranslation(vector);
279   fRebuildPolyhedron = true;                   << 
280 }                                                 200 }
281                                                   201 
282 ////////////////////////////////////////////// << 202 ///////////////////////////////////////////////////////////////
283 //                                                203 //
284 // Get bounding box                            << 
285                                                << 
286 void G4DisplacedSolid::BoundingLimits(G4ThreeV << 
287                                       G4ThreeV << 
288 {                                              << 
289   if (!fDirectTransform->IsRotated())          << 
290   {                                            << 
291     // Special case of pure translation        << 
292     //                                         << 
293     fPtrSolid->BoundingLimits(pMin,pMax);      << 
294     G4ThreeVector offset = fDirectTransform->N << 
295     pMin += offset;                            << 
296     pMax += offset;                            << 
297   }                                            << 
298   else                                         << 
299   {                                            << 
300     // General case, use CalculateExtent() to  << 
301     //                                         << 
302     G4VoxelLimits unLimit;                     << 
303     G4double xmin,xmax,ymin,ymax,zmin,zmax;    << 
304     fPtrSolid->CalculateExtent(kXAxis,unLimit, << 
305     fPtrSolid->CalculateExtent(kYAxis,unLimit, << 
306     fPtrSolid->CalculateExtent(kZAxis,unLimit, << 
307     pMin.set(xmin,ymin,zmin);                  << 
308     pMax.set(xmax,ymax,zmax);                  << 
309   }                                            << 
310                                                << 
311   // Check correctness of the bounding box     << 
312   //                                           << 
313   if (pMin.x() >= pMax.x() || pMin.y() >= pMax << 
314   {                                            << 
315     std::ostringstream message;                << 
316     message << "Bad bounding box (min >= max)  << 
317             << GetName() << " !"               << 
318             << "\npMin = " << pMin             << 
319             << "\npMax = " << pMax;            << 
320     G4Exception("G4DisplacedSolid::BoundingLim << 
321                JustWarning, message);          << 
322     DumpInfo();                                << 
323   }                                            << 
324 }                                              << 
325                                                << 
326 ////////////////////////////////////////////// << 
327 //                                                204 //
328 // Calculate extent under transform and specif << 
329                                                   205      
330 G4bool                                            206 G4bool 
331 G4DisplacedSolid::CalculateExtent( const EAxis    207 G4DisplacedSolid::CalculateExtent( const EAxis pAxis,
332                                    const G4Vox << 208                  const G4VoxelLimits& pVoxelLimit,
333                                    const G4Aff << 209                  const G4AffineTransform& pTransform,
334                                          G4dou << 210                  G4double& pMin, 
335                                          G4dou    211                                          G4double& pMax           ) const 
336 {                                                 212 {
337   G4AffineTransform sumTransform ;                213   G4AffineTransform sumTransform ;
338   sumTransform.Product(*fDirectTransform,pTran    214   sumTransform.Product(*fDirectTransform,pTransform) ;
339   return fPtrSolid->CalculateExtent(pAxis,pVox << 215   return fPtrSolid->CalculateExtent(pAxis,pVoxelLimit,sumTransform,
                                                   >> 216                                     pMin,pMax) ;
340 }                                                 217 }
341                                                   218  
342 //////////////////////////////////////////////    219 /////////////////////////////////////////////////////
343 //                                                220 //
344 // SurfaceNormal                               << 221 // 
345                                                   222 
346 EInside G4DisplacedSolid::Inside(const G4Three    223 EInside G4DisplacedSolid::Inside(const G4ThreeVector& p) const
347 {                                                 224 {
348   G4ThreeVector newPoint = fPtrTransform->Tran    225   G4ThreeVector newPoint = fPtrTransform->TransformPoint(p) ;
349   return fPtrSolid->Inside(newPoint) ;            226   return fPtrSolid->Inside(newPoint) ; 
350 }                                                 227 }
351                                                   228 
352 //////////////////////////////////////////////    229 //////////////////////////////////////////////////////////////
353 //                                                230 //
354 //                                                231 //
355                                                   232 
356 G4ThreeVector                                     233 G4ThreeVector 
357 G4DisplacedSolid::SurfaceNormal( const G4Three    234 G4DisplacedSolid::SurfaceNormal( const G4ThreeVector& p ) const 
358 {                                                 235 {
359   G4ThreeVector newPoint = fPtrTransform->Tran    236   G4ThreeVector newPoint = fPtrTransform->TransformPoint(p) ;
360   G4ThreeVector normal = fPtrSolid->SurfaceNor    237   G4ThreeVector normal = fPtrSolid->SurfaceNormal(newPoint) ; 
361   return fDirectTransform->TransformAxis(norma    238   return fDirectTransform->TransformAxis(normal) ;
                                                   >> 239     
362 }                                                 240 }
363                                                   241 
364 //////////////////////////////////////////////    242 /////////////////////////////////////////////////////////////
365 //                                                243 //
366 // The same algorithm as in DistanceToIn(p)       244 // The same algorithm as in DistanceToIn(p)
367                                                   245 
368 G4double                                          246 G4double 
369 G4DisplacedSolid::DistanceToIn( const G4ThreeV    247 G4DisplacedSolid::DistanceToIn( const G4ThreeVector& p,
370                                 const G4ThreeV << 248                                    const G4ThreeVector& v  ) const 
371 {                                                 249 {    
372   G4ThreeVector newPoint = fPtrTransform->Tran    250   G4ThreeVector newPoint = fPtrTransform->TransformPoint(p) ;
373   G4ThreeVector newDirection = fPtrTransform->    251   G4ThreeVector newDirection = fPtrTransform->TransformAxis(v) ;
374   return fPtrSolid->DistanceToIn(newPoint,newD    252   return fPtrSolid->DistanceToIn(newPoint,newDirection) ;   
375 }                                                 253 }
376                                                   254 
377 //////////////////////////////////////////////    255 ////////////////////////////////////////////////////////
378 //                                                256 //
379 // Approximate nearest distance from the point    257 // Approximate nearest distance from the point p to the intersection of
380 // two solids                                     258 // two solids
381                                                   259 
382 G4double                                          260 G4double 
383 G4DisplacedSolid::DistanceToIn( const G4ThreeV << 261 G4DisplacedSolid::DistanceToIn( const G4ThreeVector& p) const 
384 {                                                 262 {
385   G4ThreeVector newPoint = fPtrTransform->Tran    263   G4ThreeVector newPoint = fPtrTransform->TransformPoint(p) ;
386   return fPtrSolid->DistanceToIn(newPoint) ;      264   return fPtrSolid->DistanceToIn(newPoint) ;   
387 }                                                 265 }
388                                                   266 
389 //////////////////////////////////////////////    267 //////////////////////////////////////////////////////////
390 //                                                268 //
391 // The same algorithm as DistanceToOut(p)         269 // The same algorithm as DistanceToOut(p)
392                                                   270 
393 G4double                                          271 G4double 
394 G4DisplacedSolid::DistanceToOut( const G4Three    272 G4DisplacedSolid::DistanceToOut( const G4ThreeVector& p,
395                                  const G4Three << 273                   const G4ThreeVector& v,
396                                  const G4bool  << 274                   const G4bool calcNorm,
397                                        G4bool  << 275                   G4bool *validNorm,
398                                        G4Three << 276                   G4ThreeVector *n      ) const 
399 {                                                 277 {
400   G4ThreeVector solNorm ;                         278   G4ThreeVector solNorm ; 
401   G4ThreeVector newPoint = fPtrTransform->Tran    279   G4ThreeVector newPoint = fPtrTransform->TransformPoint(p) ;
402   G4ThreeVector newDirection = fPtrTransform->    280   G4ThreeVector newDirection = fPtrTransform->TransformAxis(v) ;
403   G4double dist = fPtrSolid->DistanceToOut(new    281   G4double dist = fPtrSolid->DistanceToOut(newPoint,newDirection,
404                                            cal << 282                                   calcNorm,validNorm,&solNorm) ;
405   if(calcNorm)                                    283   if(calcNorm)
406   {                                               284   { 
407     *n = fDirectTransform->TransformAxis(solNo    285     *n = fDirectTransform->TransformAxis(solNorm) ;
408   }                                               286   }
409   return dist ;                                   287   return dist ;  
410 }                                                 288 }
411                                                   289 
412 //////////////////////////////////////////////    290 //////////////////////////////////////////////////////////////
413 //                                                291 //
414 // Inverted algorithm of DistanceToIn(p)          292 // Inverted algorithm of DistanceToIn(p)
415                                                   293 
416 G4double                                          294 G4double 
417 G4DisplacedSolid::DistanceToOut( const G4Three    295 G4DisplacedSolid::DistanceToOut( const G4ThreeVector& p ) const 
418 {                                                 296 {
419   G4ThreeVector newPoint = fPtrTransform->Tran    297   G4ThreeVector newPoint = fPtrTransform->TransformPoint(p) ;
420   return fPtrSolid->DistanceToOut(newPoint) ;     298   return fPtrSolid->DistanceToOut(newPoint) ;   
421 }                                                 299 }
422                                                   300 
423 //////////////////////////////////////////////    301 //////////////////////////////////////////////////////////////
424 //                                                302 //
425 // ComputeDimensions                           << 
426                                                << 
427 void                                           << 
428 G4DisplacedSolid::ComputeDimensions(       G4V << 
429                                      const G4i << 
430                                      const G4V << 
431 {                                              << 
432   DumpInfo();                                  << 
433   G4Exception("G4DisplacedSolid::ComputeDimens << 
434               "GeomSolids0001", FatalException << 
435               "Method not applicable in this c << 
436 }                                              << 
437                                                << 
438 ////////////////////////////////////////////// << 
439 //                                             << 
440 // Return volume                               << 
441                                                << 
442 G4double G4DisplacedSolid::GetCubicVolume()    << 
443 {                                              << 
444   return fPtrSolid->GetCubicVolume();          << 
445 }                                              << 
446                                                << 
447 ////////////////////////////////////////////// << 
448 //                                             << 
449 // Return surface area                         << 
450                                                << 
451 G4double G4DisplacedSolid::GetSurfaceArea()    << 
452 {                                              << 
453   return fPtrSolid->GetSurfaceArea();          << 
454 }                                              << 
455                                                << 
456 ////////////////////////////////////////////// << 
457 //                                             << 
458 // Returns a point (G4ThreeVector) randomly an << 
459 // on the solid surface                        << 
460 //                                             << 
461                                                << 
462 G4ThreeVector G4DisplacedSolid::GetPointOnSurf << 
463 {                                              << 
464   G4ThreeVector p = fPtrSolid->GetPointOnSurfa << 
465   return fDirectTransform->TransformPoint(p);  << 
466 }                                              << 
467                                                << 
468 ////////////////////////////////////////////// << 
469 //                                                303 //
470 // Return the number of constituents used for  << 
471                                                   304 
472 G4int G4DisplacedSolid::GetNumOfConstituents() << 305 void 
473 {                                              << 306 G4DisplacedSolid::ComputeDimensions( G4VPVParameterisation* p,
474   return fPtrSolid->GetNumOfConstituents();    << 307                                   const G4int n,
475 }                                              << 308                                         const G4VPhysicalVolume* pRep ) 
476                                                << 
477 ////////////////////////////////////////////// << 
478 //                                             << 
479 // Return true if the solid has only planar fa << 
480                                                << 
481 G4bool G4DisplacedSolid::IsFaceted() const     << 
482 {                                              << 
483   return fPtrSolid->IsFaceted();               << 
484 }                                              << 
485                                                << 
486 ////////////////////////////////////////////// << 
487 //                                             << 
488 // Return object type name                     << 
489                                                << 
490 G4GeometryType G4DisplacedSolid::GetEntityType << 
491 {                                              << 
492   return {"G4DisplacedSolid"};                 << 
493 }                                              << 
494                                                << 
495 ////////////////////////////////////////////// << 
496 //                                             << 
497 // Make a clone of the object                  << 
498 //                                             << 
499 G4VSolid* G4DisplacedSolid::Clone() const      << 
500 {                                              << 
501   return new G4DisplacedSolid(*this);          << 
502 }                                              << 
503                                                << 
504 ////////////////////////////////////////////// << 
505 //                                             << 
506 // Stream object contents to an output stream  << 
507                                                << 
508 std::ostream& G4DisplacedSolid::StreamInfo(std << 
509 {                                                 309 {
510   os << "------------------------------------- << 310   // fPtrSolid->ComputeDimensions(p,n,pRep);
511      << "    *** Dump for Displaced solid - "  << 
512      << "    ================================= << 
513      << " Solid type: " << GetEntityType() <<  << 
514      << " Parameters of constituent solid: \n" << 
515      << "===================================== << 
516   fPtrSolid->StreamInfo(os);                   << 
517   os << "===================================== << 
518      << " Transformations: \n"                 << 
519      << "    Direct transformation - translati << 
520      << "           " << fDirectTransform->Net << 
521      << "                          - rotation  << 
522      << "           ";                         << 
523   fDirectTransform->NetRotation().print(os);   << 
524   os << "\n"                                   << 
525      << "===================================== << 
526                                                   311 
527   return os;                                   << 312   G4Exception("ERROR: ComputeDimensions has no meaning for a G4DisplacedSolid. It cannot be called.");
528 }                                                 313 }
529                                                   314 
530 ////////////////////////////////////////////// << 315 /////////////////////////////////////////////////
531 //                                                316 //
532 // DescribeYourselfTo                          << 317 //                    
533                                                   318 
534 void                                              319 void 
535 G4DisplacedSolid::DescribeYourselfTo ( G4VGrap    320 G4DisplacedSolid::DescribeYourselfTo ( G4VGraphicsScene& scene ) const 
536 {                                                 321 {
537   scene.AddSolid (*this);                      << 322   scene.AddThis (*this);
538 }                                                 323 }
539                                                   324 
540 ////////////////////////////////////////////// << 325 ////////////////////////////////////////////////////
                                                   >> 326 //
541 //                                                327 //
542 // CreatePolyhedron                            << 
543                                                   328 
544 G4Polyhedron*                                     329 G4Polyhedron* 
545 G4DisplacedSolid::CreatePolyhedron () const       330 G4DisplacedSolid::CreatePolyhedron () const 
546 {                                                 331 {
547   G4Polyhedron* polyhedron = fPtrSolid->Create    332   G4Polyhedron* polyhedron = fPtrSolid->CreatePolyhedron();
548   if (polyhedron != nullptr)                   << 333   polyhedron->Transform
549   {                                            << 334     (G4Transform3D(GetObjectRotation(),GetObjectTranslation()));
550     polyhedron                                 << 
551     ->Transform(G4Transform3D(GetObjectRotatio << 
552   }                                            << 
553   else                                         << 
554   {                                            << 
555     DumpInfo();                                << 
556     G4Exception("G4DisplacedSolid::CreatePolyh << 
557                 "GeomSolids2002", JustWarning, << 
558                 "No G4Polyhedron for displaced << 
559   }                                            << 
560   return polyhedron;                              335   return polyhedron;
561 }                                                 336 }
562                                                   337 
563 ////////////////////////////////////////////// << 338 /////////////////////////////////////////////////////////
                                                   >> 339 //
564 //                                                340 //
565 // GetPolyhedron                               << 
566                                                   341 
567 G4Polyhedron* G4DisplacedSolid::GetPolyhedron  << 342 G4NURBS*      
                                                   >> 343 G4DisplacedSolid::CreateNURBS      () const 
568 {                                                 344 {
569   if (fpPolyhedron == nullptr ||               << 345   // Take into account local transformation - see CreatePolyhedron.
570       fRebuildPolyhedron ||                    << 346   // return fPtrSolid->CreateNURBS() ;
571       fpPolyhedron->GetNumberOfRotationStepsAt << 347   return 0;
572       fpPolyhedron->GetNumberOfRotationSteps() << 
573     {                                          << 
574       fpPolyhedron = CreatePolyhedron();       << 
575       fRebuildPolyhedron = false;              << 
576     }                                          << 
577   return fpPolyhedron;                         << 
578 }                                                 348 }
579                                                   349