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