Geant4  9.6.p02
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4BREPSolidCylinder.cc
Go to the documentation of this file.
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 // $Id$
27 //
28 // ----------------------------------------------------------------------
29 // GEANT 4 class source file
30 //
31 // G4BREPSolidCylinder.cc
32 //
33 // ----------------------------------------------------------------------
34 
35 #include "G4BREPSolidCylinder.hh"
36 #include "G4CircularCurve.hh"
37 #include "G4FPlane.hh"
38 #include "G4FCylindricalSurface.hh"
39 
41  const G4ThreeVector& origin,
42  const G4ThreeVector& axis,
43  const G4ThreeVector& direction,
44  G4double radius,
45  G4double length)
46  : G4BREPSolid(name)
47 {
48  nb_of_surfaces = 3;
49  active=1;
50 
51  // Save constructor parameters
52  constructorParams.origin = origin;
53  constructorParams.axis = axis;
54  constructorParams.direction = direction;
55  constructorParams.length = length;
56  constructorParams.radius = radius;
57 
58  InitializeCylinder();
59 }
60 
62  : G4BREPSolid(a)
63 {
64 }
65 
67 {
68 }
69 
71  : G4BREPSolid(rhs)
72 {
73  constructorParams.origin = rhs.constructorParams.origin;
74  constructorParams.axis = rhs.constructorParams.axis;
75  constructorParams.direction = rhs.constructorParams.direction;
76  constructorParams.length = rhs.constructorParams.length;
77  constructorParams.radius = rhs.constructorParams.radius;
78 
79  InitializeCylinder();
80 }
81 
84 {
85  // Check assignment to self
86  //
87  if (this == &rhs) { return *this; }
88 
89  // Copy base class data
90  //
92 
93  // Copy data
94  //
95  constructorParams.origin = rhs.constructorParams.origin;
96  constructorParams.axis = rhs.constructorParams.axis;
97  constructorParams.direction = rhs.constructorParams.direction;
98  constructorParams.length = rhs.constructorParams.length;
99  constructorParams.radius = rhs.constructorParams.radius;
100 
101  InitializeCylinder();
102 
103  return *this;
104 }
105 
106 void G4BREPSolidCylinder::InitializeCylinder()
107 {
108  SurfaceVec = new G4Surface*[3];
109  G4CurveVector cv;
111 
112  // Creation of the cylindrical surface
113  SurfaceVec[0] = new G4FCylindricalSurface(constructorParams.origin,
114  constructorParams.axis,
115  constructorParams.radius,
116  constructorParams.length);
117  //SurfaceVec[0]->SetBoundaries(&cv);
118  //cv.clear();
119 
120  // Creation of the first circular surface, which origin is origin
121  G4Point3D ArcStart1 = G4Point3D( constructorParams.origin
122  + ( constructorParams.radius
123  * constructorParams.direction ) );
124  G4Vector3D axis1 = G4Vector3D( constructorParams.axis.cross( constructorParams.direction ) );
125 
126  tmp = new G4CircularCurve;
127  tmp->Init( G4Axis2Placement3D(constructorParams.direction, axis1,
128  constructorParams.origin),
129  constructorParams.radius );
130  tmp->SetBounds(ArcStart1, ArcStart1);
131  cv.push_back(tmp);
132 
133  SurfaceVec[1] = new G4FPlane(constructorParams.direction, axis1,
134  constructorParams.origin);
135  SurfaceVec[1]->SetBoundaries(&cv);
136  cv.clear();
137 
138 
139  // Creation of the second circular surface
140  G4Point3D origin2 = G4Point3D( constructorParams.origin
141  + ( constructorParams.length
142  * constructorParams.axis ) );
143  G4Point3D ArcStart2 = origin2
144  + G4Point3D( constructorParams.radius
145  * constructorParams.direction );
146  G4Vector3D axis2 = axis1;
147 
148  tmp = new G4CircularCurve;
149  tmp->Init( G4Axis2Placement3D(constructorParams.direction,
150  axis2, origin2),
151  constructorParams.radius);
152  tmp->SetBounds(ArcStart2, ArcStart2);
153  cv.push_back(tmp);
154 
155  SurfaceVec[2] = new G4FPlane(constructorParams.direction, axis2, origin2);
156  SurfaceVec[2]->SetBoundaries(&cv);
157  cv.clear();
158 
159  Initialize();
160 }
161 
163 {
164  return new G4BREPSolidCylinder(*this);
165 }
166 
167 std::ostream& G4BREPSolidCylinder::StreamInfo(std::ostream& os) const
168 {
169  // Streams solid contents to output stream.
170 
172  << "\n origin: " << constructorParams.origin
173  << "\n axis: " << constructorParams.axis
174  << "\n direction: " << constructorParams.direction
175  << "\n length: " << constructorParams.length
176  << "\n radius: " << constructorParams.radius
177  << "\n-----------------------------------------------------------\n";
178 
179  return os;
180 }
181