Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/geometry/solids/CSG/src/G4UCons.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/CSG/src/G4UCons.cc (Version 11.3.0) and /geometry/solids/CSG/src/G4UCons.cc (Version 11.1.1)


  1 //                                                  1 //
  2 // *******************************************      2 // ********************************************************************
  3 // * License and Disclaimer                         3 // * License and Disclaimer                                           *
  4 // *                                                4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of th      5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided      6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License      7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/      8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.           9 // * include a list of copyright holders.                             *
 10 // *                                               10 // *                                                                  *
 11 // * Neither the authors of this software syst     11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing fin     12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warran     13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assum     14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file      15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitatio     16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                               17 // *                                                                  *
 18 // * This  code  implementation is the result      18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboratio     19 // * technical work of the GEANT4 collaboration.                      *
 20 // * By using,  copying,  modifying or  distri     20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  ag     21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publicati     22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Sof     23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // *******************************************     24 // ********************************************************************
 25 //                                                 25 //
 26 // Implementation for G4UCons wrapper class        26 // Implementation for G4UCons wrapper class
 27 //                                                 27 //
 28 // 30.10.13 G.Cosmo, CERN/PH                       28 // 30.10.13 G.Cosmo, CERN/PH
 29 // -------------------------------------------     29 // --------------------------------------------------------------------
 30                                                    30 
 31 #include "G4Cons.hh"                               31 #include "G4Cons.hh"
 32 #include "G4UCons.hh"                              32 #include "G4UCons.hh"
 33                                                    33 
 34 #if ( defined(G4GEOM_USE_USOLIDS) || defined(G     34 #if ( defined(G4GEOM_USE_USOLIDS) || defined(G4GEOM_USE_PARTIAL_USOLIDS) )
 35                                                    35 
 36 #include "G4GeomTools.hh"                          36 #include "G4GeomTools.hh"
 37 #include "G4AffineTransform.hh"                    37 #include "G4AffineTransform.hh"
 38 #include "G4VPVParameterisation.hh"                38 #include "G4VPVParameterisation.hh"
 39 #include "G4BoundingEnvelope.hh"                   39 #include "G4BoundingEnvelope.hh"
 40                                                    40 
 41 using namespace CLHEP;                             41 using namespace CLHEP;
 42                                                    42 
 43 //////////////////////////////////////////////     43 //////////////////////////////////////////////////////////////////////////
 44 //                                                 44 //
 45 // constructor - check parameters, convert ang     45 // constructor - check parameters, convert angles so 0<sphi+dpshi<=2_PI
 46 //               - note if pDPhi>2PI then rese     46 //               - note if pDPhi>2PI then reset to 2PI
 47                                                    47 
 48 G4UCons::G4UCons( const G4String& pName,           48 G4UCons::G4UCons( const G4String& pName,
 49                         G4double  pRmin1, G4do     49                         G4double  pRmin1, G4double pRmax1,
 50                         G4double  pRmin2, G4do     50                         G4double  pRmin2, G4double pRmax2,
 51                         G4double pDz,              51                         G4double pDz,
 52                         G4double pSPhi, G4doub     52                         G4double pSPhi, G4double pDPhi)
 53   : Base_t(pName, pRmin1, pRmax1, pRmin2, pRma     53   : Base_t(pName, pRmin1, pRmax1, pRmin2, pRmax2, pDz, pSPhi, pDPhi)
 54 {                                                  54 {
 55 }                                                  55 }
 56                                                    56 
 57 //////////////////////////////////////////////     57 ///////////////////////////////////////////////////////////////////////
 58 //                                                 58 //
 59 // Fake default constructor - sets only member     59 // Fake default constructor - sets only member data and allocates memory
 60 //                            for usage restri     60 //                            for usage restricted to object persistency.
 61 //                                                 61 //
 62 G4UCons::G4UCons( __void__& a )                    62 G4UCons::G4UCons( __void__& a )
 63   : Base_t(a)                                      63   : Base_t(a)
 64 {                                                  64 {
 65 }                                                  65 }
 66                                                    66 
 67 //////////////////////////////////////////////     67 ///////////////////////////////////////////////////////////////////////
 68 //                                                 68 //
 69 // Destructor                                      69 // Destructor
 70                                                    70 
 71 G4UCons::~G4UCons() = default;                 <<  71 G4UCons::~G4UCons()
                                                   >>  72 {
                                                   >>  73 }
 72                                                    74 
 73 //////////////////////////////////////////////     75 //////////////////////////////////////////////////////////////////////////
 74 //                                                 76 //
 75 // Copy constructor                                77 // Copy constructor
 76                                                    78 
 77 G4UCons::G4UCons(const G4UCons& rhs)               79 G4UCons::G4UCons(const G4UCons& rhs)
 78   : Base_t(rhs)                                    80   : Base_t(rhs)
 79 {                                                  81 {
 80 }                                                  82 }
 81                                                    83 
 82 //////////////////////////////////////////////     84 //////////////////////////////////////////////////////////////////////////
 83 //                                                 85 //
 84 // Assignment operator                             86 // Assignment operator
 85                                                    87 
 86 G4UCons& G4UCons::operator = (const G4UCons& r     88 G4UCons& G4UCons::operator = (const G4UCons& rhs) 
 87 {                                                  89 {
 88    // Check assignment to self                     90    // Check assignment to self
 89    //                                              91    //
 90    if (this == &rhs)  { return *this; }            92    if (this == &rhs)  { return *this; }
 91                                                    93 
 92    // Copy base class data                         94    // Copy base class data
 93    //                                              95    //
 94    Base_t::operator=(rhs);                         96    Base_t::operator=(rhs);
 95                                                    97 
 96    return *this;                                   98    return *this;
 97 }                                                  99 }
 98                                                   100 
 99 //////////////////////////////////////////////    101 /////////////////////////////////////////////////////////////////////////
100 //                                                102 //
101 // Accessors and modifiers                        103 // Accessors and modifiers
102                                                   104 
103 G4double G4UCons::GetInnerRadiusMinusZ() const    105 G4double G4UCons::GetInnerRadiusMinusZ() const
104 {                                                 106 {
105   return GetRmin1();                              107   return GetRmin1();
106 }                                                 108 }
107 G4double G4UCons::GetOuterRadiusMinusZ() const    109 G4double G4UCons::GetOuterRadiusMinusZ() const
108 {                                                 110 {
109   return GetRmax1();                              111   return GetRmax1();
110 }                                                 112 }
111 G4double G4UCons::GetInnerRadiusPlusZ() const     113 G4double G4UCons::GetInnerRadiusPlusZ() const
112 {                                                 114 {
113   return GetRmin2();                              115   return GetRmin2();
114 }                                                 116 }
115 G4double G4UCons::GetOuterRadiusPlusZ() const     117 G4double G4UCons::GetOuterRadiusPlusZ() const
116 {                                                 118 {
117   return GetRmax2();                              119   return GetRmax2();
118 }                                                 120 }
119 G4double G4UCons::GetZHalfLength() const          121 G4double G4UCons::GetZHalfLength() const
120 {                                                 122 {
121   return GetDz();                                 123   return GetDz();
122 }                                                 124 }
123 G4double G4UCons::GetStartPhiAngle() const        125 G4double G4UCons::GetStartPhiAngle() const
124 {                                                 126 {
125   return GetSPhi();                               127   return GetSPhi();
126 }                                                 128 }
127 G4double G4UCons::GetDeltaPhiAngle() const        129 G4double G4UCons::GetDeltaPhiAngle() const
128 {                                                 130 {
129   return GetDPhi();                               131   return GetDPhi();
130 }                                                 132 }
131 G4double G4UCons::GetSinStartPhi() const          133 G4double G4UCons::GetSinStartPhi() const
132 {                                                 134 {
133   G4double phi = GetStartPhiAngle();              135   G4double phi = GetStartPhiAngle();
134   return std::sin(phi);                           136   return std::sin(phi);
135 }                                                 137 }
136 G4double G4UCons::GetCosStartPhi() const          138 G4double G4UCons::GetCosStartPhi() const
137 {                                                 139 {
138   G4double phi = GetStartPhiAngle();              140   G4double phi = GetStartPhiAngle();
139   return std::cos(phi);                           141   return std::cos(phi);
140 }                                                 142 }
141 G4double G4UCons::GetSinEndPhi() const            143 G4double G4UCons::GetSinEndPhi() const
142 {                                                 144 {
143   G4double phi = GetStartPhiAngle() + GetDelta    145   G4double phi = GetStartPhiAngle() + GetDeltaPhiAngle();
144   return std::sin(phi);                           146   return std::sin(phi);
145 }                                                 147 }
146 G4double G4UCons::GetCosEndPhi() const            148 G4double G4UCons::GetCosEndPhi() const
147 {                                                 149 {
148   G4double phi = GetStartPhiAngle() + GetDelta    150   G4double phi = GetStartPhiAngle() + GetDeltaPhiAngle();
149   return std::cos(phi);                           151   return std::cos(phi);
150 }                                                 152 }
151                                                   153   
152 void G4UCons::SetInnerRadiusMinusZ(G4double Rm    154 void G4UCons::SetInnerRadiusMinusZ(G4double Rmin1)
153 {                                                 155 {
154   SetRmin1(Rmin1);                                156   SetRmin1(Rmin1);
155   fRebuildPolyhedron = true;                      157   fRebuildPolyhedron = true;
156 }                                                 158 }
157 void G4UCons::SetOuterRadiusMinusZ(G4double Rm    159 void G4UCons::SetOuterRadiusMinusZ(G4double Rmax1)
158 {                                                 160 {
159   SetRmax1(Rmax1);                                161   SetRmax1(Rmax1);
160   fRebuildPolyhedron = true;                      162   fRebuildPolyhedron = true;
161 }                                                 163 }
162 void G4UCons::SetInnerRadiusPlusZ(G4double Rmi    164 void G4UCons::SetInnerRadiusPlusZ(G4double Rmin2)
163 {                                                 165 {
164   SetRmin2(Rmin2);                                166   SetRmin2(Rmin2);
165   fRebuildPolyhedron = true;                      167   fRebuildPolyhedron = true;
166 }                                                 168 }
167 void G4UCons::SetOuterRadiusPlusZ(G4double Rma    169 void G4UCons::SetOuterRadiusPlusZ(G4double Rmax2)
168 {                                                 170 {
169   SetRmax2(Rmax2);                                171   SetRmax2(Rmax2);
170   fRebuildPolyhedron = true;                      172   fRebuildPolyhedron = true;
171 }                                                 173 }
172 void G4UCons::SetZHalfLength(G4double newDz)      174 void G4UCons::SetZHalfLength(G4double newDz)
173 {                                                 175 {
174   SetDz(newDz);                                   176   SetDz(newDz);
175   fRebuildPolyhedron = true;                      177   fRebuildPolyhedron = true;
176 }                                                 178 }
177 void G4UCons::SetStartPhiAngle(G4double newSPh    179 void G4UCons::SetStartPhiAngle(G4double newSPhi, G4bool)
178 {                                                 180 {
179   SetSPhi(newSPhi);                               181   SetSPhi(newSPhi);
180   fRebuildPolyhedron = true;                      182   fRebuildPolyhedron = true;
181 }                                                 183 }
182 void G4UCons::SetDeltaPhiAngle(G4double newDPh    184 void G4UCons::SetDeltaPhiAngle(G4double newDPhi)
183 {                                                 185 {
184   SetDPhi(newDPhi);                               186   SetDPhi(newDPhi);
185   fRebuildPolyhedron = true;                      187   fRebuildPolyhedron = true;
186 }                                                 188 }
187                                                   189 
188 //////////////////////////////////////////////    190 /////////////////////////////////////////////////////////////////////////
189 //                                                191 //
190 // Dispatch to parameterisation for replicatio    192 // Dispatch to parameterisation for replication mechanism dimension
191 // computation & modification.                    193 // computation & modification.
192                                                   194 
193 void G4UCons::ComputeDimensions(      G4VPVPar    195 void G4UCons::ComputeDimensions(      G4VPVParameterisation* p,
194                                 const G4int       196                                 const G4int                  n,
195                                 const G4VPhysi    197                                 const G4VPhysicalVolume*     pRep    )
196 {                                                 198 {
197   p->ComputeDimensions(*(G4Cons*)this,n,pRep);    199   p->ComputeDimensions(*(G4Cons*)this,n,pRep);
198 }                                                 200 }
199                                                   201 
200 //////////////////////////////////////////////    202 //////////////////////////////////////////////////////////////////////////
201 //                                                203 //
202 // Make a clone of the object                     204 // Make a clone of the object
203                                                   205 
204 G4VSolid* G4UCons::Clone() const                  206 G4VSolid* G4UCons::Clone() const
205 {                                                 207 {
206   return new G4UCons(*this);                      208   return new G4UCons(*this);
207 }                                                 209 }
208                                                   210 
209 //////////////////////////////////////////////    211 //////////////////////////////////////////////////////////////////////////
210 //                                                212 //
211 // Get bounding box                               213 // Get bounding box
212                                                   214 
213 void G4UCons::BoundingLimits(G4ThreeVector& pM    215 void G4UCons::BoundingLimits(G4ThreeVector& pMin, G4ThreeVector& pMax) const
214 {                                                 216 {
215   static G4bool checkBBox = true;                 217   static G4bool checkBBox = true;
216                                                   218 
217   G4double rmin = std::min(GetInnerRadiusMinus    219   G4double rmin = std::min(GetInnerRadiusMinusZ(),GetInnerRadiusPlusZ());
218   G4double rmax = std::max(GetOuterRadiusMinus    220   G4double rmax = std::max(GetOuterRadiusMinusZ(),GetOuterRadiusPlusZ());
219   G4double dz   = GetZHalfLength();               221   G4double dz   = GetZHalfLength();
220                                                   222 
221   // Find bounding box                            223   // Find bounding box
222   //                                              224   //
223   if (GetDeltaPhiAngle() < twopi)                 225   if (GetDeltaPhiAngle() < twopi)
224   {                                               226   {
225     G4TwoVector vmin,vmax;                        227     G4TwoVector vmin,vmax;
226     G4GeomTools::DiskExtent(rmin,rmax,            228     G4GeomTools::DiskExtent(rmin,rmax,
227                             GetSinStartPhi(),G    229                             GetSinStartPhi(),GetCosStartPhi(),
228                             GetSinEndPhi(),Get    230                             GetSinEndPhi(),GetCosEndPhi(),
229                             vmin,vmax);           231                             vmin,vmax);
230     pMin.set(vmin.x(),vmin.y(),-dz);              232     pMin.set(vmin.x(),vmin.y(),-dz);
231     pMax.set(vmax.x(),vmax.y(), dz);              233     pMax.set(vmax.x(),vmax.y(), dz);
232   }                                               234   }
233   else                                            235   else
234   {                                               236   {
235     pMin.set(-rmax,-rmax,-dz);                    237     pMin.set(-rmax,-rmax,-dz);
236     pMax.set( rmax, rmax, dz);                    238     pMax.set( rmax, rmax, dz);
237   }                                               239   }
238                                                   240 
239   // Check correctness of the bounding box        241   // Check correctness of the bounding box
240   //                                              242   //
241   if (pMin.x() >= pMax.x() || pMin.y() >= pMax    243   if (pMin.x() >= pMax.x() || pMin.y() >= pMax.y() || pMin.z() >= pMax.z())
242   {                                               244   {
243     std::ostringstream message;                   245     std::ostringstream message;
244     message << "Bad bounding box (min >= max)     246     message << "Bad bounding box (min >= max) for solid: "
245             << GetName() << " !"                  247             << GetName() << " !"
246             << "\npMin = " << pMin                248             << "\npMin = " << pMin
247             << "\npMax = " << pMax;               249             << "\npMax = " << pMax;
248     G4Exception("G4UCons::BoundingLimits()", "    250     G4Exception("G4UCons::BoundingLimits()", "GeomMgt0001",
249                 JustWarning, message);            251                 JustWarning, message);
250     StreamInfo(G4cout);                           252     StreamInfo(G4cout);
251   }                                               253   }
252                                                   254 
253   // Check consistency of bounding boxes          255   // Check consistency of bounding boxes
254   //                                              256   //
255   if (checkBBox)                                  257   if (checkBBox)
256   {                                               258   {
257     U3Vector vmin, vmax;                          259     U3Vector vmin, vmax;
258     Extent(vmin,vmax);                            260     Extent(vmin,vmax);
259     if (std::abs(pMin.x()-vmin.x()) > kCarTole    261     if (std::abs(pMin.x()-vmin.x()) > kCarTolerance ||
260         std::abs(pMin.y()-vmin.y()) > kCarTole    262         std::abs(pMin.y()-vmin.y()) > kCarTolerance ||
261         std::abs(pMin.z()-vmin.z()) > kCarTole    263         std::abs(pMin.z()-vmin.z()) > kCarTolerance ||
262         std::abs(pMax.x()-vmax.x()) > kCarTole    264         std::abs(pMax.x()-vmax.x()) > kCarTolerance ||
263         std::abs(pMax.y()-vmax.y()) > kCarTole    265         std::abs(pMax.y()-vmax.y()) > kCarTolerance ||
264         std::abs(pMax.z()-vmax.z()) > kCarTole    266         std::abs(pMax.z()-vmax.z()) > kCarTolerance)
265     {                                             267     {
266       std::ostringstream message;                 268       std::ostringstream message;
267       message << "Inconsistency in bounding bo    269       message << "Inconsistency in bounding boxes for solid: "
268               << GetName() << " !"                270               << GetName() << " !"
269               << "\nBBox min: wrapper = " << p    271               << "\nBBox min: wrapper = " << pMin << " solid = " << vmin
270               << "\nBBox max: wrapper = " << p    272               << "\nBBox max: wrapper = " << pMax << " solid = " << vmax;
271       G4Exception("G4UCons::BoundingLimits()",    273       G4Exception("G4UCons::BoundingLimits()", "GeomMgt0001",
272                   JustWarning, message);          274                   JustWarning, message);
273       checkBBox = false;                          275       checkBBox = false;
274     }                                             276     }
275   }                                               277   }
276 }                                                 278 }
277                                                   279 
278 //////////////////////////////////////////////    280 /////////////////////////////////////////////////////////////////////////
279 //                                                281 //
280 // Calculate extent under transform and specif    282 // Calculate extent under transform and specified limit
281                                                   283 
282 G4bool                                            284 G4bool
283 G4UCons::CalculateExtent(const EAxis pAxis,       285 G4UCons::CalculateExtent(const EAxis pAxis,
284                          const G4VoxelLimits&     286                          const G4VoxelLimits& pVoxelLimit,
285                          const G4AffineTransfo    287                          const G4AffineTransform& pTransform,
286                                G4double& pMin,    288                                G4double& pMin, G4double& pMax) const
287 {                                                 289 {
288   G4ThreeVector bmin, bmax;                       290   G4ThreeVector bmin, bmax;
289   G4bool exist;                                   291   G4bool exist;
290                                                   292 
291   // Get bounding box                             293   // Get bounding box
292   BoundingLimits(bmin,bmax);                      294   BoundingLimits(bmin,bmax);
293                                                   295 
294   // Check bounding box                           296   // Check bounding box
295   G4BoundingEnvelope bbox(bmin,bmax);             297   G4BoundingEnvelope bbox(bmin,bmax);
296 #ifdef G4BBOX_EXTENT                              298 #ifdef G4BBOX_EXTENT
297   if (true) return bbox.CalculateExtent(pAxis,    299   if (true) return bbox.CalculateExtent(pAxis,pVoxelLimit,pTransform,pMin,pMax);
298 #endif                                            300 #endif
299   if (bbox.BoundingBoxVsVoxelLimits(pAxis,pVox    301   if (bbox.BoundingBoxVsVoxelLimits(pAxis,pVoxelLimit,pTransform,pMin,pMax))
300   {                                               302   {
301     return exist = pMin < pMax;                << 303     return exist = (pMin < pMax) ? true : false;
302   }                                               304   }
303                                                   305 
304   // Get parameters of the solid                  306   // Get parameters of the solid
305   G4double rmin1 = GetInnerRadiusMinusZ();        307   G4double rmin1 = GetInnerRadiusMinusZ();
306   G4double rmax1 = GetOuterRadiusMinusZ();        308   G4double rmax1 = GetOuterRadiusMinusZ();
307   G4double rmin2 = GetInnerRadiusPlusZ();         309   G4double rmin2 = GetInnerRadiusPlusZ();
308   G4double rmax2 = GetOuterRadiusPlusZ();         310   G4double rmax2 = GetOuterRadiusPlusZ();
309   G4double dz    = GetZHalfLength();              311   G4double dz    = GetZHalfLength();
310   G4double dphi  = GetDeltaPhiAngle();            312   G4double dphi  = GetDeltaPhiAngle();
311                                                   313 
312   // Find bounding envelope and calculate exte    314   // Find bounding envelope and calculate extent
313   //                                              315   //
314   const G4int NSTEPS = 24;            // numbe    316   const G4int NSTEPS = 24;            // number of steps for whole circle
315   G4double astep  = twopi/NSTEPS;     // max a    317   G4double astep  = twopi/NSTEPS;     // max angle for one step
316   G4int    ksteps = (dphi <= astep) ? 1 : (G4i    318   G4int    ksteps = (dphi <= astep) ? 1 : (G4int)((dphi-deg)/astep) + 1;
317   G4double ang    = dphi/ksteps;                  319   G4double ang    = dphi/ksteps;
318                                                   320 
319   G4double sinHalf = std::sin(0.5*ang);           321   G4double sinHalf = std::sin(0.5*ang);
320   G4double cosHalf = std::cos(0.5*ang);           322   G4double cosHalf = std::cos(0.5*ang);
321   G4double sinStep = 2.*sinHalf*cosHalf;          323   G4double sinStep = 2.*sinHalf*cosHalf;
322   G4double cosStep = 1. - 2.*sinHalf*sinHalf;     324   G4double cosStep = 1. - 2.*sinHalf*sinHalf;
323   G4double rext1   = rmax1/cosHalf;               325   G4double rext1   = rmax1/cosHalf;
324   G4double rext2   = rmax2/cosHalf;               326   G4double rext2   = rmax2/cosHalf;
325                                                   327 
326   // bounding envelope for full cone without h    328   // bounding envelope for full cone without hole consists of two polygons,
327   // in other cases it is a sequence of quadri    329   // in other cases it is a sequence of quadrilaterals
328   if (rmin1 == 0 && rmin2 == 0 && dphi == twop    330   if (rmin1 == 0 && rmin2 == 0 && dphi == twopi)
329   {                                               331   {
330     G4double sinCur = sinHalf;                    332     G4double sinCur = sinHalf;
331     G4double cosCur = cosHalf;                    333     G4double cosCur = cosHalf;
332                                                   334 
333     G4ThreeVectorList baseA(NSTEPS),baseB(NSTE    335     G4ThreeVectorList baseA(NSTEPS),baseB(NSTEPS);
334     for (G4int k=0; k<NSTEPS; ++k)                336     for (G4int k=0; k<NSTEPS; ++k)
335     {                                             337     {
336       baseA[k].set(rext1*cosCur,rext1*sinCur,-    338       baseA[k].set(rext1*cosCur,rext1*sinCur,-dz);
337       baseB[k].set(rext2*cosCur,rext2*sinCur,     339       baseB[k].set(rext2*cosCur,rext2*sinCur, dz);
338                                                   340 
339       G4double sinTmp = sinCur;                   341       G4double sinTmp = sinCur;
340       sinCur = sinCur*cosStep + cosCur*sinStep    342       sinCur = sinCur*cosStep + cosCur*sinStep;
341       cosCur = cosCur*cosStep - sinTmp*sinStep    343       cosCur = cosCur*cosStep - sinTmp*sinStep;
342     }                                             344     }
343     std::vector<const G4ThreeVectorList *> pol    345     std::vector<const G4ThreeVectorList *> polygons(2);
344     polygons[0] = &baseA;                         346     polygons[0] = &baseA;
345     polygons[1] = &baseB;                         347     polygons[1] = &baseB;
346     G4BoundingEnvelope benv(bmin,bmax,polygons    348     G4BoundingEnvelope benv(bmin,bmax,polygons);
347     exist = benv.CalculateExtent(pAxis,pVoxelL    349     exist = benv.CalculateExtent(pAxis,pVoxelLimit,pTransform,pMin,pMax);
348   }                                               350   }
349   else                                            351   else
350   {                                               352   {
351     G4double sinStart = GetSinStartPhi();         353     G4double sinStart = GetSinStartPhi();
352     G4double cosStart = GetCosStartPhi();         354     G4double cosStart = GetCosStartPhi();
353     G4double sinEnd   = GetSinEndPhi();           355     G4double sinEnd   = GetSinEndPhi();
354     G4double cosEnd   = GetCosEndPhi();           356     G4double cosEnd   = GetCosEndPhi();
355     G4double sinCur   = sinStart*cosHalf + cos    357     G4double sinCur   = sinStart*cosHalf + cosStart*sinHalf;
356     G4double cosCur   = cosStart*cosHalf - sin    358     G4double cosCur   = cosStart*cosHalf - sinStart*sinHalf;
357                                                   359 
358     // set quadrilaterals                         360     // set quadrilaterals
359     G4ThreeVectorList pols[NSTEPS+2];             361     G4ThreeVectorList pols[NSTEPS+2];
360     for (G4int k=0; k<ksteps+2; ++k) pols[k].r    362     for (G4int k=0; k<ksteps+2; ++k) pols[k].resize(4);
361     pols[0][0].set(rmin2*cosStart,rmin2*sinSta    363     pols[0][0].set(rmin2*cosStart,rmin2*sinStart, dz);
362     pols[0][1].set(rmin1*cosStart,rmin1*sinSta    364     pols[0][1].set(rmin1*cosStart,rmin1*sinStart,-dz);
363     pols[0][2].set(rmax1*cosStart,rmax1*sinSta    365     pols[0][2].set(rmax1*cosStart,rmax1*sinStart,-dz);
364     pols[0][3].set(rmax2*cosStart,rmax2*sinSta    366     pols[0][3].set(rmax2*cosStart,rmax2*sinStart, dz);
365     for (G4int k=1; k<ksteps+1; ++k)              367     for (G4int k=1; k<ksteps+1; ++k)
366     {                                             368     {
367       pols[k][0].set(rmin2*cosCur,rmin2*sinCur    369       pols[k][0].set(rmin2*cosCur,rmin2*sinCur, dz);
368       pols[k][1].set(rmin1*cosCur,rmin1*sinCur    370       pols[k][1].set(rmin1*cosCur,rmin1*sinCur,-dz);
369       pols[k][2].set(rext1*cosCur,rext1*sinCur    371       pols[k][2].set(rext1*cosCur,rext1*sinCur,-dz);
370       pols[k][3].set(rext2*cosCur,rext2*sinCur    372       pols[k][3].set(rext2*cosCur,rext2*sinCur, dz);
371                                                   373 
372       G4double sinTmp = sinCur;                   374       G4double sinTmp = sinCur;
373       sinCur = sinCur*cosStep + cosCur*sinStep    375       sinCur = sinCur*cosStep + cosCur*sinStep;
374       cosCur = cosCur*cosStep - sinTmp*sinStep    376       cosCur = cosCur*cosStep - sinTmp*sinStep;
375     }                                             377     }
376     pols[ksteps+1][0].set(rmin2*cosEnd,rmin2*s    378     pols[ksteps+1][0].set(rmin2*cosEnd,rmin2*sinEnd, dz);
377     pols[ksteps+1][1].set(rmin1*cosEnd,rmin1*s    379     pols[ksteps+1][1].set(rmin1*cosEnd,rmin1*sinEnd,-dz);
378     pols[ksteps+1][2].set(rmax1*cosEnd,rmax1*s    380     pols[ksteps+1][2].set(rmax1*cosEnd,rmax1*sinEnd,-dz);
379     pols[ksteps+1][3].set(rmax2*cosEnd,rmax2*s    381     pols[ksteps+1][3].set(rmax2*cosEnd,rmax2*sinEnd, dz);
380                                                   382 
381     // set envelope and calculate extent          383     // set envelope and calculate extent
382     std::vector<const G4ThreeVectorList *> pol    384     std::vector<const G4ThreeVectorList *> polygons;
383     polygons.resize(ksteps+2);                    385     polygons.resize(ksteps+2);
384     for (G4int k=0; k<ksteps+2; ++k) polygons[    386     for (G4int k=0; k<ksteps+2; ++k) polygons[k] = &pols[k];
385     G4BoundingEnvelope benv(bmin,bmax,polygons    387     G4BoundingEnvelope benv(bmin,bmax,polygons);
386     exist = benv.CalculateExtent(pAxis,pVoxelL    388     exist = benv.CalculateExtent(pAxis,pVoxelLimit,pTransform,pMin,pMax);
387   }                                               389   }
388   return exist;                                   390   return exist;
389 }                                                 391 }
390                                                   392 
391 //////////////////////////////////////////////    393 //////////////////////////////////////////////////////////////////////////
392 //                                                394 //
393 // Create polyhedron for visualization            395 // Create polyhedron for visualization
394                                                   396 
395 G4Polyhedron* G4UCons::CreatePolyhedron() cons    397 G4Polyhedron* G4UCons::CreatePolyhedron() const
396 {                                                 398 {
397   return new G4PolyhedronCons(GetInnerRadiusMi    399   return new G4PolyhedronCons(GetInnerRadiusMinusZ(),
398                               GetOuterRadiusMi    400                               GetOuterRadiusMinusZ(),
399                               GetInnerRadiusPl    401                               GetInnerRadiusPlusZ(),
400                               GetOuterRadiusPl    402                               GetOuterRadiusPlusZ(),
401                               GetZHalfLength()    403                               GetZHalfLength(),
402                               GetStartPhiAngle    404                               GetStartPhiAngle(),
403                               GetDeltaPhiAngle    405                               GetDeltaPhiAngle());
404 }                                                 406 }
405                                                   407 
406 #endif  // G4GEOM_USE_USOLIDS                     408 #endif  // G4GEOM_USE_USOLIDS
407                                                   409