Files
geant4/source/geometry/solids/BREPS/ToDo.txt
T
2016-06-08 15:09:25 +02:00

322 lines
10 KiB
Plaintext

Juanary 20, 1999
Lionel Broglia Patron
Working note
This document describes the modifications to be done into
BREPS and STEPintervace classes
============================================
BREPS
- implement G4BSplineCurve::IntersectRay2D
As the same as all the curve classes, IntersectRay2D(ray) is a function which
return the number of intersections of the curve by the ray included into the
curve's boundaries. (see G4Line::IntersectRay2D for exemple)
- problem with nbintersect when the hitpoint is on the curve boundary
In this case, the point is considerated into the surface, so return an odd
specific value (999). (done for G4Line)
- implement swept surface (later)
- Be carreful into G4BREPSolidxxx::Inside :
if we obtain the same distance with 2 intersections,
it is necessary to count one only (done for PCone & PGone)
- Utilize the DistanceTo and Inside functions of PCone, which are
general, in G4BREPSolid.
After, utilize specific functions for each particular solid to
have a faster algorithm
============================================
STEPinterface
- take the name of the solids
- write out STEP (later)
- Problem with STEP conical surface (same for cylindrical)
for the moment the interface create a G4ConicalSurface,
but I want to create a G4FConicalSurface
In STEP, a conical surface is defined by a semi-infinite cone and 1 or 2 plane
which delimite the length of the cone. The semi-infinite cone is defined by a
G4Axis2Placement3D (location and axis), a radius and an angle. The radius is
the radius of the cone at the location. For the moment, a STEP conical surface
is saved as a G4ConicalSurface(placement, angle).
On the contrary a G4FConicalSurface is defined by a placement, a large_radius,
a small_radius and a length :
// Position.axis|
// |
// -- ---|--- small_radius
// l | / | \
// e | / | \
// n | / | \
// g | / | \
// t | / | \
// h | / | \
// -- ---------|--------- large_radius
// Position
In the same way, In STEP, a cylindrical surface is defined by an infinite
cylinder and 1 or 2 plane which delimite the length of the cylinder. The
semi-infinite cylinder is defined by a G4Axis2Placement3D (location and axis)
and a radius. For the moment, a STEP cylindrical surface is saved as a
G4CylindricalSurface(placement, radius).
On the contrary a G4FCylindricalSurface is defined by a placement, a radius and
a length :
// Position.axis| radius
// >|---|<---------
// |
// -- +---|---+
// l | | | |
// e | | | |
// n | | | |
// g | | | |
// t | | | |
// h | | | |
// -- +---|---+
// Position
It is necessary to find a way to save a STEP conical or cylindrical surface in
a G4FConicalSurface or G4FCylindricalSurface because the algorithms of Inside
and DistanceToX are written and run correctly for PCone and PGone which utilize
these surfaces.
One solution is to create with the STEP interface the G4FConicalSurface
or the G4FCylindricalSurface with new creators. And before execute the
Intersect or the HowNear function, recalculate the good values.
==> Tests
- verify the validity of the results of the simple tests
- new simple specific test for curve and surface
- compare with CSG test
- new more general test
======================================
Function explanation
Inside(Pt)
// This function returns whether the point is inside,
// outside or on the surface of the solid
DistanceToIn(Pt)
// Calculates the shortest distance ("safety") from a point
// outside the solid to any boundary of this solid.
// Return 0 if the point is already inside.
DistanceToIn(Pt, Vec)
// Calculates the distance from a point outside the solid
// to the solid`s boundary along a specified direction vector.
//
// Note : Intersections with boundaries less than the
// tolerance must be ignored if the direction
// is away from the boundary
DistanceToOut(Pt)
// Calculates the shortest distance ("safety") from a point
// inside the solid to any boundary of this solid.
// Return 0 if the point is already outside.
DistanceToOut(Pt, Vec)
// Calculates the distance from a point inside the solid
// to the solid`s boundary along a specified direction vector.
// Return 0 if the point is already outside.
//
// Note : If the shortest distance to a boundary is less
// than the tolerance, it is ignored. This allows
// for a point within a tolerant boundary to leave
// immediately
Problem with DistanceToIn(Pt) and DistanceToOut(Pt) :
Problem with the G4FPlane : there is no inside and no outside...
So, to test if the point is inside to return 0, utilize the Inside
function. But I don`t know if it is really needed because dToIn is
called only if the point is outside...
So for the moment, I cannot ensure to return 0 if the point is inside for
DistanceToOut and outside for DistanceToIn.
G4BREPSolid is utilized for the creation of solid with STEP interface. For
the moment, the G4BREPSolid::Inside function utilize some other G4BREPSolid
functions which are redondant in some cases, and I don`t understand exactly
what they done.
These functions are identical into PCone and Polyhedra and I think there are
general functions, so try to copy them into the G4BREPSolid class.
After that, it's possible to optimize these functions into each specific solid
(PCone, Pgone, Box, etc...)
These 5 functions utilized other functions :
- TestSurfaceBBoxes (solid function)
- SurfaceNormal (solid function)
- HowNear (surface function)
- Intersect (surface function)
TestSurfaceBBoxes(ray)
// Test if the bounding box of each surface is intersected
// by the ray. If not, the surface become deactive.
This function is placed at the begining of all the DistanceTo and Inside
functions. It is utilized to deactive the surface which bounding box is not
intersected by the ray. In this way, we do not make the complicate and long
Intersect function for the surfaces we are sure that they are not intersected.
SurfaceNormal(Pt)
// This function calculates the normal of the
// solid boundary surface on a point on this surface
// Note : the sense of the normal depends on the sense of the surface
This solid function check on which of its surface the point is, and after call
the SurfaceNormal(Pt) function of this surface. The sense of the normal depends
on the sense of the surface : if it's an inner surface the sense is 0, and if
it's an outer surface the sense is 1.
The normal calculate at first is by default away from the boundary. But if the
sense is 0 the normal is the opposite.
HowNear(Pt)
// Shortest distance from the point x to the G4...Surface.
// The distance will be positive if the point is outside
// the G4...Surface, negative if the point is inside.
In the case of the G4FPlane, HowNear is the closest distance from the point to
the infinite plane.
In the case of the G4FCylindrical and G4FConical surface, the closest distance
from the point to the infinite volume is calculated at first. But if this
distance correspond to the distance from the start point to a point outside the
surface boundary, return the distance from the point to the nearest plane
which delimite the surface length.
Be careful !
Insure that HowNear < 0 correspond to point inside
HowNear > 0 correspond to point outside
HowNear = 0 correspond to point on the surface
The sign is needed for DistanceToIn(pt) and DistanceToOut(pt)
Problem : for the plane, there is no inside and no outside !
(see the comments for these 2 functions)
Intersect(Ray)
// This function count the number of intersections of a
// bounded surface by a ray.
Set "distance" to the closest distance from the start point to the nearest
intersection and return the number of intersections. If no intersection is
founded, set distance = kInfinity and return 0.
If this number is par, it`s signify that the start point of the ray is outside
the volume bounded by the surface. So, for the case of the solid Inside
calculation, ignored this intersections because the point is outside this
part of the volume.
In the case of the intersection of the ray and a G4FPlane, we calculate at
first the intersection with the infinite plane. After, we have to determine if
the intersection is inside the finite plane.
To do that, the intersection point and the curve boudary of the finite plane
are projected in 2D both. So we determine if the projected hit is inside or
outside the projected surface.
To do that, the function IntersectRay2D is utilized, which return the number of
intersections of a test ray which started point is the projected hit with the
projected curve boundaries. If the number of intersections is odd, the
projected hit is inside the projected boundary, so the intersection point is
inside the G4FPlane and we find a real intersection.
In the same way, into each curve IntersectRay2D function, all the intersections
are calculated at first, and after we determine which intersection is on the
bounded curve and in the direction of the ray. In case of the projected point
is on the curve, the projectedhit is considerated inside the projected surface.
So return immediately a specific odd value (999).
For the moment, only the G4Line:IntersectRay2D is completed, do the same for
each curve.
In the case of the G4FConicalSurface and G4FCylindricalSurface, the Intersect
function is easier. At first, all the intersections of the infinite surface by
the ray are calculated. After, we determine if the intersection points are in
the direction of the ray and are inside the bounding box of the surface.
Generality :
- there are unnecessary #include, especially in STEPinterface
- utilize G4int, G4double, G4bool instead of int, double, bool ...
- look inside G4Ray class : there are plane functions inside !!!
- replace : #define toto 3.25
by : const double toto=3.25
placed all this constant values in a .hh file (maybe G4Globals.hh)
- utilize the HEP classes and the function of the HEP classes
ex : replace G4Plane by HepPlane if it is possible
replace G4ThreeMat by HepMatrix or HepTransform3D
( see http://wwwinfo.cern.ch/asd/lhc++/clhep/manual/RefGuide/index.html )
- see if FLT_MAXX can replaced by kInfinity and FLT_EPSILO by kCarTolerance