Geant4 Cross Reference |
>> 1 // This code implementation is the intellectual property of >> 2 // the GEANT4 collaboration. 1 // 3 // 2 // ******************************************* << 4 // By copying, distributing or modifying the Program (or any work 3 // * License and Disclaimer << 5 // based on the Program) you indicate your acceptance of this statement, 4 // * << 6 // and all its terms. 5 // * The Geant4 software is copyright of th << 6 // * the Geant4 Collaboration. It is provided << 7 // * conditions of the Geant4 Software License << 8 // * LICENSE and available at http://cern.ch/ << 9 // * include a list of copyright holders. << 10 // * << 11 // * Neither the authors of this software syst << 12 // * institutes,nor the agencies providing fin << 13 // * work make any representation or warran << 14 // * regarding this software system or assum << 15 // * use. Please see the license in the file << 16 // * for the full disclaimer and the limitatio << 17 // * << 18 // * This code implementation is the result << 19 // * technical work of the GEANT4 collaboratio << 20 // * By using, copying, modifying or distri << 21 // * any work based on the software) you ag << 22 // * use in resulting scientific publicati << 23 // * acceptance of all terms of the Geant4 Sof << 24 // ******************************************* << 25 // << 26 // 7 // >> 8 // $Id: G4VisExtent.cc,v 1.4 1999/12/15 14:50:37 gunter Exp $ >> 9 // GEANT4 tag $Name: geant4-03-00 $ 27 // 10 // 28 // 11 // 29 // A.Walkden 28/11/95 12 // A.Walkden 28/11/95 30 // G4VisExtent.cc - to return parameters usefu 13 // G4VisExtent.cc - to return parameters useful to the drawing window 31 // employed by Visualization code. 14 // employed by Visualization code. 32 15 33 #include "G4VisExtent.hh" 16 #include "G4VisExtent.hh" 34 17 35 #include "G4ThreeVector.hh" << 18 #include "G4ios.hh" 36 19 37 G4VisExtent::G4VisExtent (G4double xmin, G4dou << 20 G4VisExtent::G4VisExtent (G4double xmin, G4double xmax, 38 G4double ymin, G4dou << 21 G4double ymin, G4double ymax, 39 G4double zmin, G4dou << 22 G4double zmin, G4double zmax) 40 fXmin(xmin), fXmax(xmax), fYmin(ymin), fYmax << 23 :fXmin(xmin), fXmax(xmax), fYmin(ymin), fYmax(ymax), fZmin(zmin), fZmax(zmax) 41 fRadiusCached(false), fCentreCached(false), << 42 {} 24 {} 43 25 44 G4VisExtent::G4VisExtent (const G4Point3D& cen << 26 G4VisExtent::G4VisExtent (const G4Point3D& centre, G4double radius) { 45 fRadiusCached(true), fCentreCached(true), << 27 // Use inscribed radius to define G3VisExtent so that 46 fRadius(radius), fCentre(centre) << 28 // GetExtentRadius gets radius back again. The one is the "inverse" 47 { << 29 // of the other, so to speak. 48 // Use exscribed radius ... see comments in << 30 G4double inscribedRadius = radius / sqrt (3.); 49 G4double halfSide (radius / std::sqrt (3.)); << 31 fXmin = centre.x () - inscribedRadius; 50 fXmin = centre.x () - halfSide; << 32 fXmax = centre.x () + inscribedRadius; 51 fXmax = centre.x () + halfSide; << 33 fYmin = centre.y () - inscribedRadius; 52 fYmin = centre.y () - halfSide; << 34 fYmax = centre.y () + inscribedRadius; 53 fYmax = centre.y () + halfSide; << 35 fZmin = centre.z () - inscribedRadius; 54 fZmin = centre.z () - halfSide; << 36 fZmax = centre.z () + inscribedRadius; 55 fZmax = centre.z () + halfSide; << 37 } 56 } << 38 57 << 39 G4VisExtent::~G4VisExtent () {} 58 G4VisExtent::~G4VisExtent () = default; << 40 59 << 41 G4Point3D G4VisExtent::GetExtentCentre () const { 60 const G4VisExtent& G4VisExtent::GetNullExtent << 42 return G4Point3D (((fXmin + fXmax) / 2.), 61 static const G4VisExtent nullExtent = G4VisE << 43 ((fYmin + fYmax) / 2.), 62 return nullExtent; << 44 ((fZmin + fZmax) / 2.)); 63 } << 64 << 65 const G4Point3D& G4VisExtent::GetExtentCentre << 66 if (!fCentreCached) { << 67 fCentre = G4Point3D (((fXmin + fXmax) / 2. << 68 ((fYmin + fYmax) / 2. << 69 ((fZmin + fZmax) / 2. << 70 fCentreCached = true; << 71 } << 72 return fCentre; << 73 } 45 } 74 46 75 G4double G4VisExtent::GetExtentRadius () const 47 G4double G4VisExtent::GetExtentRadius () const { 76 if (!fRadiusCached) { << 48 return sqrt (((fXmax - fXmin) * (fXmax - fXmin)) + 77 fRadius = std::sqrt (((fXmax - fXmin) * (f << 49 ((fYmax - fYmin) * (fYmax - fYmin)) + 78 ((fYmax - fYmin) * (f << 50 ((fZmax - fZmin) * (fZmax - fZmin))) / 2.; 79 ((fZmax - fZmin) * (f << 80 fRadiusCached = true; << 81 } << 82 return fRadius; << 83 } 51 } 84 << 52 85 std::ostream& operator << (std::ostream& os, c << 53 G4std::ostream& operator << (G4std::ostream& os, const G4VisExtent& e) { 86 os << "G4VisExtent (bounding box):"; 54 os << "G4VisExtent (bounding box):"; 87 os << "\n X limits: " << e.fXmin << ' ' << 55 os << "\n X limits: " << e.fXmin << ' ' << e.fXmax; 88 os << "\n Y limits: " << e.fYmin << ' ' << 56 os << "\n Y limits: " << e.fYmin << ' ' << e.fYmax; 89 os << "\n Z limits: " << e.fZmin << ' ' << 57 os << "\n Z limits: " << e.fZmin << ' ' << e.fZmax; 90 return os; 58 return os; 91 } 59 } 92 60 93 G4bool G4VisExtent::operator != (const G4VisEx 61 G4bool G4VisExtent::operator != (const G4VisExtent& e) const { 94 return ((fXmin != e.fXmin) || 62 return ((fXmin != e.fXmin) || 95 (fXmax != e.fXmax) || << 63 (fXmax != e.fXmax) || 96 (fYmin != e.fYmin) || << 64 (fYmin != e.fYmin) || 97 (fYmax != e.fYmax) || << 65 (fYmax != e.fYmax) || 98 (fZmin != e.fZmin) || << 66 (fZmin != e.fZmin) || 99 (fZmax != e.fZmax)); << 67 (fZmax != e.fZmax)); 100 } << 101 << 102 G4VisExtent& G4VisExtent::Transform (const G4T << 103 { << 104 const auto& rotation = transform.getRotation << 105 const auto& translation = transform.getTrans << 106 << 107 G4ThreeVector nnn(fXmin,fYmin,fZmin); << 108 G4ThreeVector nnx(fXmin,fYmin,fZmax); << 109 G4ThreeVector nxn(fXmin,fYmax,fZmin); << 110 G4ThreeVector nxx(fXmin,fYmax,fZmax); << 111 G4ThreeVector xnn(fXmax,fYmin,fZmin); << 112 G4ThreeVector xnx(fXmax,fYmin,fZmax); << 113 G4ThreeVector xxn(fXmax,fYmax,fZmin); << 114 G4ThreeVector xxx(fXmax,fYmax,fZmax); << 115 << 116 nnn.transform(rotation); nnn += translation; << 117 nnx.transform(rotation); nnx += translation; << 118 nxn.transform(rotation); nxn += translation; << 119 nxx.transform(rotation); nxx += translation; << 120 xnn.transform(rotation); xnn += translation; << 121 xnx.transform(rotation); xnx += translation; << 122 xxn.transform(rotation); xxn += translation; << 123 xxx.transform(rotation); xxx += translation; << 124 << 125 fXmin = DBL_MAX; << 126 fYmin = DBL_MAX; << 127 fZmin = DBL_MAX; << 128 fXmax = -DBL_MAX; << 129 fYmax = -DBL_MAX; << 130 fZmax = -DBL_MAX; << 131 for (const auto& corner: {nnn,nnx,nxn,nxx,xn << 132 if (fXmin > corner.getX()) fXmin = corner. << 133 if (fYmin > corner.getY()) fYmin = corner. << 134 if (fZmin > corner.getZ()) fZmin = corner. << 135 if (fXmax < corner.getX()) fXmax = corner. << 136 if (fYmax < corner.getY()) fYmax = corner. << 137 if (fZmax < corner.getZ()) fZmax = corner. << 138 } << 139 << 140 return *this; << 141 } 68 } 142 69