Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
G4Ray.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//
27// $Id$
28//
29// ----------------------------------------------------------------------
30// GEANT 4 class source file
31//
32// G4Ray.cc
33//
34// ----------------------------------------------------------------------
35
36#include "G4Ray.hh"
37#include "G4PointRat.hh"
38
40 : r_min(0.), r_max(0.)
41{
42}
43
44G4Ray::G4Ray(const G4Point3D& start0, const G4Vector3D& dir0)
45{
46 Init(start0, dir0);
47}
48
50{
51}
52
53
54const G4Plane& G4Ray::GetPlane(G4int number_of_plane) const
55{
56 if(number_of_plane==1)
57 { return plane2; }
58 else
59 { return plane1; }
60}
61
62
64{
65 // Creates two orthogonal planes(plane1,plane2) the ray (rray)
66 // situated in the intersection of the planes. The planes are
67 // used to project the surface (nurb) in two dimensions.
68
69 G4Vector3D RayDir = dir;
70 G4Point3D RayOrigin = start;
71
72 G4Point3D p1, p2, p3, p4;
73 G4Vector3D dir1, dir2;
75
76 if(!NearZero(RayDir.x(), SQRT_SMALL_FASTF))
77 { invdir.setX(1.0 / RayDir.x()); }
78
79 if(!NearZero(RayDir.y(), SQRT_SMALL_FASTF))
80 { invdir.setY(1.0 / RayDir.y()); }
81
82 if(!NearZero(RayDir.z(), SQRT_SMALL_FASTF))
83 { invdir.setZ(1.0 / RayDir.z()); }
84
85 MatVecOrtho(dir1, RayDir);
86
87 Vcross( dir2, RayDir, dir1);
88 Vmove(p1, RayOrigin);
89 Vadd2(p2, RayOrigin, RayDir);
90 Vadd2(p3, RayOrigin, dir1);
91 Vadd2(p4, RayOrigin, dir2);
92
93 CalcPlane3Pts( plane1, p1, p3, p2);
94 CalcPlane3Pts( plane2, p1, p2, p4);
95}
96
97
98void G4Ray::MatVecOrtho(register G4Vector3D &out,
99 register const G4Vector3D &in )
100{
101 register G4double f;
102 G4int i_Which;
103
104 if( NearZero(in.x(), 0.0001)
105 && NearZero(in.y(), 0.0001)
106 && NearZero(in.z(), 0.0001) )
107 {
108 Vsetall( out, 0 );
109 return;
110 }
111
112 // Find component closest to zero
113 f = std::fabs(in.x());
114 i_Which=0;
115
116 if( std::fabs(in.y()) < f )
117 {
118 f = std::fabs(in.y());
119 i_Which=1;
120 }
121
122 if( std::fabs(in.z()) < f )
123 {
124 i_Which=2;
125 }
126
127 if(!i_Which)
128 {
129 f = std::sqrt((in.y())*(in.y())+(in.z())*(in.z())); // hypot(in.y(),in.z())
130 }
131 else
132 {
133 if(i_Which==1)
134 {
135 f = std::sqrt((in.z())*(in.z())+(in.x())*(in.x())); // hypot(in.z(),in.x())
136 }
137 else
138 {
139 f = std::sqrt((in.x())*(in.x())+(in.y())*(in.y())); // hypot(in.x(),in.y())
140 }
141 }
142 if( NearZero( f, SMALL ) )
143 {
144 Vsetall( out, 0 );
145 return;
146 }
147
148 f = 1.0/f;
149
150 if(!i_Which)
151 {
152 out.setX(0.0);
153 out.setY(-in.z()*f);
154 out.setZ( in.y()*f);
155 }
156 else
157 {
158 if(i_Which==1)
159 {
160 out.setY(0.0);
161 out.setZ(-in.x()*f);
162 out.setX( in.y()*f);
163 }
164 else
165 {
166 out.setZ(0.0);
167 out.setX(-in.z()*f);
168 out.setY( in.y()*f);
169 }
170 }
171}
172
173
174// CALC_PLANE_3PTS
175//
176// Find the equation of a G4Plane that contains three points.
177// Note that Normal vector created is expected to point out (see vmath.h),
178// so the vector from A to C had better be counter-clockwise
179// (about the point A) from the vector from A to B.
180// This follows the outward-pointing Normal convention, and the
181// right-hand rule for cross products.
182//
183/*
184 C
185 *
186 |\
187 | \
188 ^ N | \
189 | \ | \
190 | \ | \
191 |C-A \ | \
192 | \ | \
193 | \ | \
194 \| \
195 *---------*
196 A B
197 ----->
198 B-A
199*/
200// If the points are given in the order A B C (eg, *counter*-clockwise),
201// then the outward pointing surface Normal N = (B-A) x (C-A).
202//
203// Explicit Return -
204// 0 OK
205// -1 Failure. At least two of the points were not distinct,
206// or all three were colinear.
207//
208// Implicit Return -
209// G4Plane The G4Plane equation is stored here.
210
211
213 const G4Point3D& a,
214 const G4Point3D& b,
215 const G4Point3D& c )
216{
217 // Creates the two orthogonal planes which are needed in projecting the
218 // surface into 2D.
219
220 G4Vector3D B_A;
221 G4Vector3D C_A;
222 G4Vector3D C_B;
223
224 register G4double mag;
225
226 Vsub2( B_A, b, a );
227 Vsub2( C_A, c, a );
228 Vsub2( C_B, c, b );
229
230 Vcross( plane1, B_A, C_A );
231
232 // Ensure unit length Normal
233 mag = Magnitude(plane1);
234 if( mag <= SQRT_SMALL_FASTF )
235 {
236 return(-1);// FAIL
237 }
238
239 mag = 1/mag;
240
241 G4Plane pl2(plane1);
242 Vscale( plane1, pl2, mag );
243
244 // Find distance from the origin to the G4Plane
245 plane1.d = Vdot( plane1, a );
246
247 return(0); //ok
248}
249
250
252{
253 // Check that the ray has a G4Vector3D...
254 if (dir==G4Vector3D(0, 0, 0))
255 {
256 G4Exception("G4Ray::RayCheck()", "GeomSolids0002", FatalException,
257 "Invalid zero direction given !");
258 }
259
260 // Make sure that the vector is unit length
261 dir= dir.unit();
262 r_min = 0;
263 r_max = 0;
264}
265
266
267void G4Ray::Vcross(G4Plane &a, const G4Vector3D &b, const G4Vector3D &c)
268{
269 a.a = b.y() * c.z() - b.z() * c.y() ;
270 a.b = b.z() * c.x() - b.x() * c.z() ;
271 a.c = b.x() * c.y() - b.y() * c.x() ;
272}
273
274
275void G4Ray::Vcross(G4Vector3D &a, const G4Vector3D &b, const G4Vector3D &c)
276{
277 a.setX(b.y() * c.z() - b.z() * c.y()) ;
278 a.setY(b.z() * c.x() - b.x() * c.z()) ;
279 a.setZ(b.x() * c.y() - b.y() * c.x()) ;
280}
281
282
284{
285 a.setX(b.x());
286 a.setY(b.y());
287 a.setZ(b.z());
288}
289
290
291void G4Ray::Vadd2(G4Point3D &a, const G4Point3D &b, const G4Vector3D &c)
292{
293 a.setX(b.x() + c.x()) ;
294 a.setY(b.y() + c.y()) ;
295 a.setZ(b.z() + c.z()) ;
296}
297
298
299void G4Ray::Vsub2(G4Vector3D &a, const G4Point3D &b, const G4Point3D &c)
300{
301 a.setX(b.x() - c.x());
302 a.setY(b.y() - c.y());
303 a.setZ(b.z() - c.z());
304}
305
306
307void G4Ray::Vscale(G4Plane& a, const G4Plane& b, G4double c)
308{
309 a.a = b.a * c;
310 a.b = b.b * c;
311 a.c = b.c * c;
312}
313
314
316{
317 return (a.a * b.x() +
318 a.b * b.y() +
319 a.c * b.z());
320}
321
322
324{
325 return ( a.a * a.a + a.b * a.b + a.c *a.c );
326}
327
328
330{
331 return (std::sqrt( Magsq( a )) );
332}
@ FatalException
#define SMALL
Definition: G4PointRat.hh:50
const G4Point3D PINFINITY(kInfinity, kInfinity, kInfinity)
#define SQRT_SMALL_FASTF
Definition: G4PointRat.hh:49
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
HepGeom::Vector3D< G4double > G4Vector3D
Definition: G4Vector3D.hh:35
G4double d
Definition: G4Plane.hh:52
G4double a
Definition: G4Plane.hh:52
G4double c
Definition: G4Plane.hh:52
G4double b
Definition: G4Plane.hh:52
G4int NearZero(G4double val, G4double epsilon) const
static void Vmove(G4Point3D &a, const G4Point3D &b)
Definition: G4Ray.cc:283
static G4double Vdot(const G4Plane &a, const G4Point3D &b)
Definition: G4Ray.cc:315
void RayCheck()
Definition: G4Ray.cc:251
const G4Plane & GetPlane(G4int number_of_plane) const
Definition: G4Ray.cc:54
static void Vcross(G4Plane &a, const G4Vector3D &b, const G4Vector3D &c)
Definition: G4Ray.cc:267
G4Ray()
Definition: G4Ray.cc:39
void Vsetall(G4Vector3D &a, G4double s)
static G4int CalcPlane3Pts(G4Plane &plane, const G4Point3D &a, const G4Point3D &b, const G4Point3D &c)
Definition: G4Ray.cc:212
static void Vscale(G4Plane &a, const G4Plane &b, G4double c)
Definition: G4Ray.cc:307
static G4double Magsq(const G4Plane &a)
Definition: G4Ray.cc:323
void CreatePlanes()
Definition: G4Ray.cc:63
static void Vsub2(G4Vector3D &a, const G4Point3D &b, const G4Point3D &c)
Definition: G4Ray.cc:299
void Init(const G4Point3D &start0, const G4Vector3D &dir0)
void MatVecOrtho(register G4Vector3D &out, register const G4Vector3D &in)
Definition: G4Ray.cc:98
static void Vadd2(G4Point3D &a, const G4Point3D &b, const G4Vector3D &c)
Definition: G4Ray.cc:291
static G4double Magnitude(const G4Plane &a)
Definition: G4Ray.cc:329
~G4Ray()
Definition: G4Ray.cc:49
BasicVector3D< T > unit() const
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41