Geant4 Cross Reference |
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 // 26 // >> 27 // $Id: G4VisExtent.cc,v 1.10 2006/06/29 19:07:28 gunter Exp $ >> 28 // GEANT4 tag $Name: geant4-08-03-patch-01 $ 27 // 29 // 28 // 30 // 29 // A.Walkden 28/11/95 31 // A.Walkden 28/11/95 30 // G4VisExtent.cc - to return parameters usefu 32 // G4VisExtent.cc - to return parameters useful to the drawing window 31 // employed by Visualization code. 33 // employed by Visualization code. 32 34 33 #include "G4VisExtent.hh" 35 #include "G4VisExtent.hh" 34 36 35 #include "G4ThreeVector.hh" << 37 #include "G4ios.hh" 36 38 37 G4VisExtent::G4VisExtent (G4double xmin, G4dou << 39 const G4VisExtent G4VisExtent::NullExtent; // Default extent is null. 38 G4double ymin, G4dou << 40 39 G4double zmin, G4dou << 41 G4VisExtent::G4VisExtent (G4double xmin, G4double xmax, 40 fXmin(xmin), fXmax(xmax), fYmin(ymin), fYmax << 42 G4double ymin, G4double ymax, 41 fRadiusCached(false), fCentreCached(false), << 43 G4double zmin, G4double zmax) >> 44 :fXmin(xmin), fXmax(xmax), fYmin(ymin), fYmax(ymax), fZmin(zmin), fZmax(zmax) 42 {} 45 {} 43 46 44 G4VisExtent::G4VisExtent (const G4Point3D& cen << 47 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 48 // Use exscribed radius ... see comments in header file. 49 G4double halfSide (radius / std::sqrt (3.)); 49 G4double halfSide (radius / std::sqrt (3.)); 50 fXmin = centre.x () - halfSide; 50 fXmin = centre.x () - halfSide; 51 fXmax = centre.x () + halfSide; 51 fXmax = centre.x () + halfSide; 52 fYmin = centre.y () - halfSide; 52 fYmin = centre.y () - halfSide; 53 fYmax = centre.y () + halfSide; 53 fYmax = centre.y () + halfSide; 54 fZmin = centre.z () - halfSide; 54 fZmin = centre.z () - halfSide; 55 fZmax = centre.z () + halfSide; 55 fZmax = centre.z () + halfSide; 56 } 56 } 57 57 58 G4VisExtent::~G4VisExtent () = default; << 58 G4VisExtent::~G4VisExtent () {} 59 << 60 const G4VisExtent& G4VisExtent::GetNullExtent << 61 static const G4VisExtent nullExtent = G4VisE << 62 return nullExtent; << 63 } << 64 59 65 const G4Point3D& G4VisExtent::GetExtentCentre << 60 G4Point3D G4VisExtent::GetExtentCentre () const { 66 if (!fCentreCached) { << 61 return G4Point3D (((fXmin + fXmax) / 2.), 67 fCentre = G4Point3D (((fXmin + fXmax) / 2. << 62 ((fYmin + fYmax) / 2.), 68 ((fYmin + fYmax) / 2. << 63 ((fZmin + fZmax) / 2.)); 69 ((fZmin + fZmax) / 2. << 70 fCentreCached = true; << 71 } << 72 return fCentre; << 73 } 64 } 74 65 75 G4double G4VisExtent::GetExtentRadius () const 66 G4double G4VisExtent::GetExtentRadius () const { 76 if (!fRadiusCached) { << 67 return std::sqrt (((fXmax - fXmin) * (fXmax - fXmin)) + 77 fRadius = std::sqrt (((fXmax - fXmin) * (f << 68 ((fYmax - fYmin) * (fYmax - fYmin)) + 78 ((fYmax - fYmin) * (f << 69 ((fZmax - fZmin) * (fZmax - fZmin))) / 2.; 79 ((fZmax - fZmin) * (f << 80 fRadiusCached = true; << 81 } << 82 return fRadius; << 83 } 70 } 84 << 71 85 std::ostream& operator << (std::ostream& os, c 72 std::ostream& operator << (std::ostream& os, const G4VisExtent& e) { 86 os << "G4VisExtent (bounding box):"; 73 os << "G4VisExtent (bounding box):"; 87 os << "\n X limits: " << e.fXmin << ' ' << 74 os << "\n X limits: " << e.fXmin << ' ' << e.fXmax; 88 os << "\n Y limits: " << e.fYmin << ' ' << 75 os << "\n Y limits: " << e.fYmin << ' ' << e.fYmax; 89 os << "\n Z limits: " << e.fZmin << ' ' << 76 os << "\n Z limits: " << e.fZmin << ' ' << e.fZmax; 90 return os; 77 return os; 91 } 78 } 92 79 93 G4bool G4VisExtent::operator != (const G4VisEx 80 G4bool G4VisExtent::operator != (const G4VisExtent& e) const { 94 return ((fXmin != e.fXmin) || 81 return ((fXmin != e.fXmin) || 95 (fXmax != e.fXmax) || << 82 (fXmax != e.fXmax) || 96 (fYmin != e.fYmin) || << 83 (fYmin != e.fYmin) || 97 (fYmax != e.fYmax) || << 84 (fYmax != e.fYmax) || 98 (fZmin != e.fZmin) || << 85 (fZmin != e.fZmin) || 99 (fZmax != e.fZmax)); << 86 (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 } 87 } 142 88