Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer << 3 // * DISCLAIMER * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th << 5 // * The following disclaimer summarizes all the specific disclaimers * 6 // * the Geant4 Collaboration. It is provided << 6 // * of contributors to this software. The specific disclaimers,which * 7 // * conditions of the Geant4 Software License << 7 // * govern, are listed with their locations in: * 8 // * LICENSE and available at http://cern.ch/ << 8 // * http://cern.ch/geant4/license * 9 // * include a list of copyright holders. << 10 // * 9 // * * 11 // * Neither the authors of this software syst 10 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 11 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 12 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 13 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file << 14 // * use. * 16 // * for the full disclaimer and the limitatio << 17 // * 15 // * * 18 // * This code implementation is the result << 16 // * This code implementation is the intellectual property of the * 19 // * technical work of the GEANT4 collaboratio << 17 // * GEANT4 collaboration. * 20 // * By using, copying, modifying or distri << 18 // * By copying, distributing or modifying the Program (or any work * 21 // * any work based on the software) you ag << 19 // * based on the Program) you indicate your acceptance of this * 22 // * use in resulting scientific publicati << 20 // * statement, and all its terms. * 23 // * acceptance of all terms of the Geant4 Sof << 24 // ******************************************* 21 // ******************************************************************** 25 // 22 // 26 // 23 // >> 24 // $Id: G4VisExtent.cc,v 1.6 2001/07/24 21:39:50 johna Exp $ >> 25 // GEANT4 tag $Name: geant4-05-01-patch-01 $ 27 // 26 // 28 // 27 // 29 // A.Walkden 28/11/95 28 // A.Walkden 28/11/95 30 // G4VisExtent.cc - to return parameters usefu 29 // G4VisExtent.cc - to return parameters useful to the drawing window 31 // employed by Visualization code. 30 // employed by Visualization code. 32 31 33 #include "G4VisExtent.hh" 32 #include "G4VisExtent.hh" 34 33 35 #include "G4ThreeVector.hh" << 34 #include "G4ios.hh" 36 35 37 G4VisExtent::G4VisExtent (G4double xmin, G4dou << 36 G4VisExtent::G4VisExtent (G4double xmin, G4double xmax, 38 G4double ymin, G4dou << 37 G4double ymin, G4double ymax, 39 G4double zmin, G4dou << 38 G4double zmin, G4double zmax) 40 fXmin(xmin), fXmax(xmax), fYmin(ymin), fYmax << 39 :fXmin(xmin), fXmax(xmax), fYmin(ymin), fYmax(ymax), fZmin(zmin), fZmax(zmax) 41 fRadiusCached(false), fCentreCached(false), << 42 {} 40 {} 43 41 44 G4VisExtent::G4VisExtent (const G4Point3D& cen << 42 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 43 // Use exscribed radius ... see comments in header file. 49 G4double halfSide (radius / std::sqrt (3.)); << 44 G4double halfSide (radius / sqrt (3.)); 50 fXmin = centre.x () - halfSide; 45 fXmin = centre.x () - halfSide; 51 fXmax = centre.x () + halfSide; 46 fXmax = centre.x () + halfSide; 52 fYmin = centre.y () - halfSide; 47 fYmin = centre.y () - halfSide; 53 fYmax = centre.y () + halfSide; 48 fYmax = centre.y () + halfSide; 54 fZmin = centre.z () - halfSide; 49 fZmin = centre.z () - halfSide; 55 fZmax = centre.z () + halfSide; 50 fZmax = centre.z () + halfSide; 56 } 51 } 57 52 58 G4VisExtent::~G4VisExtent () = default; << 53 G4VisExtent::~G4VisExtent () {} 59 54 60 const G4VisExtent& G4VisExtent::GetNullExtent << 55 G4Point3D G4VisExtent::GetExtentCentre () const { 61 static const G4VisExtent nullExtent = G4VisE << 56 return G4Point3D (((fXmin + fXmax) / 2.), 62 return nullExtent; << 57 ((fYmin + fYmax) / 2.), 63 } << 58 ((fZmin + fZmax) / 2.)); 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 } 59 } 74 60 75 G4double G4VisExtent::GetExtentRadius () const 61 G4double G4VisExtent::GetExtentRadius () const { 76 if (!fRadiusCached) { << 62 return sqrt (((fXmax - fXmin) * (fXmax - fXmin)) + 77 fRadius = std::sqrt (((fXmax - fXmin) * (f << 63 ((fYmax - fYmin) * (fYmax - fYmin)) + 78 ((fYmax - fYmin) * (f << 64 ((fZmax - fZmin) * (fZmax - fZmin))) / 2.; 79 ((fZmax - fZmin) * (f << 80 fRadiusCached = true; << 81 } << 82 return fRadius; << 83 } 65 } 84 << 66 85 std::ostream& operator << (std::ostream& os, c << 67 G4std::ostream& operator << (G4std::ostream& os, const G4VisExtent& e) { 86 os << "G4VisExtent (bounding box):"; 68 os << "G4VisExtent (bounding box):"; 87 os << "\n X limits: " << e.fXmin << ' ' << 69 os << "\n X limits: " << e.fXmin << ' ' << e.fXmax; 88 os << "\n Y limits: " << e.fYmin << ' ' << 70 os << "\n Y limits: " << e.fYmin << ' ' << e.fYmax; 89 os << "\n Z limits: " << e.fZmin << ' ' << 71 os << "\n Z limits: " << e.fZmin << ' ' << e.fZmax; 90 return os; 72 return os; 91 } 73 } 92 74 93 G4bool G4VisExtent::operator != (const G4VisEx 75 G4bool G4VisExtent::operator != (const G4VisExtent& e) const { 94 return ((fXmin != e.fXmin) || 76 return ((fXmin != e.fXmin) || 95 (fXmax != e.fXmax) || << 77 (fXmax != e.fXmax) || 96 (fYmin != e.fYmin) || << 78 (fYmin != e.fYmin) || 97 (fYmax != e.fYmax) || << 79 (fYmax != e.fYmax) || 98 (fZmin != e.fZmin) || << 80 (fZmin != e.fZmin) || 99 (fZmax != e.fZmax)); << 81 (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 } 82 } 142 83