Files
geant4/source/geometry/solids/BREPS/src/G4BREPSolidSphere.cc
T
2016-06-08 15:42:07 +02:00

111 lines
2.5 KiB
C++

// This code implementation is the intellectual property of
// the GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4BREPSolidSphere.cc,v 1.2 1999/12/15 14:50:00 gunter Exp $
// GEANT4 tag $Name: geant4-02-00 $
//
#include "G4BREPSolidSphere.hh"
#include "G4SphericalSurface.hh"
G4BREPSolidSphere::G4BREPSolidSphere(const G4String name,
const G4Vector3D& o,
const G4Vector3D& xhat,
const G4Vector3D& zhat,
G4double r): G4BREPSolid(name)
{
SurfaceVec = new G4Surface*[1];
G4double ph1 = 0;
G4double ph2 = 2*M_PI;
G4double th1 = 0;
G4double th2 = M_PI;
SurfaceVec[0] = new G4SphericalSurface(o, xhat, zhat, r, ph1, ph2, th1, th2);
nb_of_surfaces = 1;
active=1;
Initialize();
}
EInside G4BREPSolidSphere::Inside(register const G4ThreeVector& Pt) const
{
G4double Dist = SurfaceVec[0]->HowNear(Pt);
if(Dist > 0+kCarTolerance) return kInside;
if(Dist < 0-kCarTolerance) return kOutside;
return kSurface;
}
G4ThreeVector G4BREPSolidSphere::SurfaceNormal(const G4ThreeVector& Pt) const
{
G4Vector3D n = SurfaceVec[0]->Normal(Pt);
G4ThreeVector norm(n.x(), n.y(), n.z());
return norm;
}
G4double G4BREPSolidSphere::DistanceToIn(const G4ThreeVector& Pt) const
{
return fabs(SurfaceVec[0]->HowNear(Pt));
}
G4double G4BREPSolidSphere::DistanceToIn(register const G4ThreeVector& Pt,
register const G4ThreeVector& V) const
{
SphReset();
G4Vector3D Pttmp(Pt);
G4Vector3D Vtmp(V);
G4Ray r(Pttmp, Vtmp);
int Result = SurfaceVec[0]->Intersect( r );
if(Result>0)
{
ShortestDistance = SurfaceVec[0]->Distance();
return sqrt(ShortestDistance);
}
return kInfinity;
}
G4double G4BREPSolidSphere::DistanceToOut(register const G4ThreeVector& Pt,
register const G4ThreeVector& V,
const G4bool calcNorm,
G4bool *validNorm,
G4ThreeVector *n) const
{
if(validNorm)
*validNorm = false;
SphReset();
G4Vector3D Pttmp(Pt);
G4Vector3D Vtmp(V);
G4Ray r(Pttmp, Vtmp);
if(SurfaceVec[0]->Intersect( r ))
{
if(calcNorm)
{
*validNorm = true;
*n = SurfaceNormal(Pt);
}
ShortestDistance = SurfaceVec[0]->Distance();
return sqrt(ShortestDistance);
}
return kInfinity;
}
G4double G4BREPSolidSphere::DistanceToOut(const G4ThreeVector& Pt) const
{
return fabs(SurfaceVec[0]->HowNear(Pt));
}