Geant4 Cross Reference |
1 // 2 // ******************************************************************** 3 // * License and Disclaimer * 4 // * * 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. * 10 // * * 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitation of liability. * 17 // * * 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************************************** 25 // 26 // 27 // 28 // 29 // A.Walkden 28/11/95 30 // G4VisExtent.cc - to return parameters useful to the drawing window 31 // employed by Visualization code. 32 33 #include "G4VisExtent.hh" 34 35 #include "G4ThreeVector.hh" 36 37 G4VisExtent::G4VisExtent (G4double xmin, G4double xmax, 38 G4double ymin, G4double ymax, 39 G4double zmin, G4double zmax): 40 fXmin(xmin), fXmax(xmax), fYmin(ymin), fYmax(ymax), fZmin(zmin), fZmax(zmax), 41 fRadiusCached(false), fCentreCached(false), fRadius(0.) 42 {} 43 44 G4VisExtent::G4VisExtent (const G4Point3D& centre, G4double radius): 45 fRadiusCached(true), fCentreCached(true), 46 fRadius(radius), fCentre(centre) 47 { 48 // Use exscribed radius ... see comments in header file. 49 G4double halfSide (radius / std::sqrt (3.)); 50 fXmin = centre.x () - halfSide; 51 fXmax = centre.x () + halfSide; 52 fYmin = centre.y () - halfSide; 53 fYmax = centre.y () + halfSide; 54 fZmin = centre.z () - halfSide; 55 fZmax = centre.z () + halfSide; 56 } 57 58 G4VisExtent::~G4VisExtent () = default; 59 60 const G4VisExtent& G4VisExtent::GetNullExtent () { 61 static const G4VisExtent nullExtent = G4VisExtent(); 62 return nullExtent; 63 } 64 65 const G4Point3D& G4VisExtent::GetExtentCentre () const { 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 } 74 75 G4double G4VisExtent::GetExtentRadius () const { 76 if (!fRadiusCached) { 77 fRadius = std::sqrt (((fXmax - fXmin) * (fXmax - fXmin)) + 78 ((fYmax - fYmin) * (fYmax - fYmin)) + 79 ((fZmax - fZmin) * (fZmax - fZmin))) / 2.; 80 fRadiusCached = true; 81 } 82 return fRadius; 83 } 84 85 std::ostream& operator << (std::ostream& os, const G4VisExtent& e) { 86 os << "G4VisExtent (bounding box):"; 87 os << "\n X limits: " << e.fXmin << ' ' << e.fXmax; 88 os << "\n Y limits: " << e.fYmin << ' ' << e.fYmax; 89 os << "\n Z limits: " << e.fZmin << ' ' << e.fZmax; 90 return os; 91 } 92 93 G4bool G4VisExtent::operator != (const G4VisExtent& e) const { 94 return ((fXmin != e.fXmin) || 95 (fXmax != e.fXmax) || 96 (fYmin != e.fYmin) || 97 (fYmax != e.fYmax) || 98 (fZmin != e.fZmin) || 99 (fZmax != e.fZmax)); 100 } 101 102 G4VisExtent& G4VisExtent::Transform (const G4Transform3D& transform) 103 { 104 const auto& rotation = transform.getRotation(); 105 const auto& translation = transform.getTranslation(); 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,xnn,xnx,xxn,xxx}) { 132 if (fXmin > corner.getX()) fXmin = corner.getX(); 133 if (fYmin > corner.getY()) fYmin = corner.getY(); 134 if (fZmin > corner.getZ()) fZmin = corner.getZ(); 135 if (fXmax < corner.getX()) fXmax = corner.getX(); 136 if (fYmax < corner.getY()) fYmax = corner.getY(); 137 if (fZmax < corner.getZ()) fZmax = corner.getZ(); 138 } 139 140 return *this; 141 } 142