59 #if !defined(G4GEOM_USE_UTET)
61 const char G4Tet::CVSVers[]=
"$Id: G4Tet.cc 83572 2014-09-01 15:23:27Z gcosmo $";
85 using namespace CLHEP;
101 :
G4VSolid(pName), fRebuildPolyhedron(false), fpPolyhedron(0), warningFlag(0)
111 G4double signed_vol=fV21.cross(fV31).dot(fV41);
144 if(degeneracyFlag) *degeneracyFlag=degenerate;
148 "Degenerate tetrahedron not allowed.");
151 fTol=1e-9*(std::fabs(
fXMin)+std::fabs(fXMax)+std::fabs(fYMin)
152 +std::fabs(fYMax)+std::fabs(fZMin)+std::fabs(fZMax));
197 :
G4VSolid(a), fCubicVolume(0.), fSurfaceArea(0.),
198 fRebuildPolyhedron(false), fpPolyhedron(0),
199 fAnchor(0,0,0), fP2(0,0,0), fP3(0,0,0), fP4(0,0,0), fMiddle(0,0,0),
200 fNormal123(0,0,0), fNormal142(0,0,0), fNormal134(0,0,0),
201 fNormal234(0,0,0), warningFlag(0),
202 fCdotN123(0.), fCdotN142(0.), fCdotN134(0.), fCdotN234(0.),
203 fXMin(0.), fXMax(0.), fYMin(0.), fYMax(0.), fZMin(0.), fZMax(0.),
204 fDx(0.), fDy(0.), fDz(0.), fTol(0.), fMaxSize(0.)
223 fCubicVolume(rhs.fCubicVolume), fSurfaceArea(rhs.fSurfaceArea),
224 fRebuildPolyhedron(false), fpPolyhedron(0), fAnchor(rhs.fAnchor),
225 fP2(rhs.fP2), fP3(rhs.fP3), fP4(rhs.fP4), fMiddle(rhs.fMiddle),
226 fNormal123(rhs.fNormal123), fNormal142(rhs.fNormal142),
227 fNormal134(rhs.fNormal134), fNormal234(rhs.fNormal234),
228 warningFlag(rhs.warningFlag), fCdotN123(rhs.fCdotN123),
229 fCdotN142(rhs.fCdotN142), fCdotN134(rhs.fCdotN134),
230 fCdotN234(rhs.fCdotN234), fXMin(rhs.fXMin), fXMax(rhs.fXMax),
231 fYMin(rhs.fYMin), fYMax(rhs.fYMax), fZMin(rhs.fZMin), fZMax(rhs.fZMax),
232 fDx(rhs.fDx), fDy(rhs.fDy), fDz(rhs.fDz), fTol(rhs.fTol),
233 fMaxSize(rhs.fMaxSize)
246 if (
this == &rhs) {
return *
this; }
281 G4Tet *
object=
new G4Tet(
"temp",anchor,p2,p3,p4,&result);
328 xMin = xoffset +
fXMin;
329 xMax = xoffset +
fXMax;
331 yMin = yoffset +
fYMin;
332 yMax = yoffset +
fYMax;
334 zMin = zoffset +
fZMin;
335 zMax = zoffset +
fZMax;
463 if( noSurfaces == 1 )
469 return sumnorm.unit();
475 if( (r123<=r134) && (r123<=r142) && (r123<=r234) ) {
return fNormal123; }
476 else if ( (r134<=r142) && (r134<=r234) ) {
return fNormal134; }
499 if( (t>=-
fTol) && (t<tmin) )
501 hp=p+vu*(t+extraDistance);
515 if( (t>=-
fTol) && (t<tmin) )
517 hp=p+vu*(t+extraDistance);
531 if( (t>=-
fTol) && (t<tmin) )
533 hp=p+vu*(t+extraDistance);
547 if( (t>=-
fTol) && (t<tmin) )
549 hp=p+vu*(t+extraDistance);
616 std::ostringstream message;
617 message <<
"No good intersection found or already outside!?" <<
G4endl
618 <<
"p = " << p /
mm <<
"mm" <<
G4endl
620 <<
"t1, t2, t3, t4 (mm) "
621 << t1/
mm <<
", " << t2/
mm <<
", " << t3/
mm <<
", " << t4/
mm;
622 G4Exception(
"G4Tet::DistanceToOut(p,v,...)",
"GeomSolids1002",
629 else if(calcNorm && n)
637 if(validNorm) { *validNorm=
true; }
661 return (tmin <
fTol)? 0:tmin;
676 vertices->reserve(4);
692 "Error in allocation of vertices. Out of memory !");
712 return new G4Tet(*
this);
721 G4int oldprc = os.precision(16);
722 os <<
"-----------------------------------------------------------\n"
723 <<
" *** Dump for solid - " <<
GetName() <<
" ***\n"
724 <<
" ===================================================\n"
725 <<
" Solid type: G4Tet\n"
728 <<
" p2: " <<
fP2/
mm <<
" mm \n"
729 <<
" p3: " <<
fP3/
mm <<
" mm \n"
730 <<
" p4: " <<
fP4/
mm <<
" mm \n"
735 <<
"-----------------------------------------------------------\n";
736 os.precision(oldprc);
760 area = 0.5*(v.cross(w)).mag();
762 return (p2 + lambda1*w + lambda2*v);
771 G4double chose,aOne,aTwo,aThree,aFour;
780 if( (chose>=0.) && (chose <aOne) ) {
return p1;}
781 else if( (chose>=aOne) && (chose < aOne+aTwo) ) {
return p2;}
782 else if( (chose>=aOne+aTwo) && (chose<aOne+aTwo+aThree) ) {
return p3;}
792 std::vector<G4ThreeVector> vertices(4);
847 const G4int faces[4][4]={{1,3,2,0},{1,4,3,0},{1,2,4,0},{2,3,4,0}};
849 xyz[1][0]=
fP2.x(); xyz[1][1]=
fP2.y(); xyz[1][2]=
fP2.z();
850 xyz[2][0]=
fP3.x(); xyz[2][1]=
fP3.y(); xyz[2][2]=
fP3.z();
851 xyz[3][0]=
fP4.x(); xyz[3][1]=
fP4.y(); xyz[3][2]=
fP4.z();
853 ph->createPolyhedron(4,4,xyz,faces);
ThreeVector shoot(const G4int Ap, const G4int Af)
G4double DistanceToOut(const G4ThreeVector &p, const G4ThreeVector &v, const G4bool calcNorm=false, G4bool *validNorm=0, G4ThreeVector *n=0) const
G4bool fRebuildPolyhedron
static const G4double kInfinity
G4double GetMinYExtent() const
CLHEP::Hep3Vector G4ThreeVector
G4ThreeVector GetPointOnSurface() const
G4bool IsYLimited() const
G4double DistanceToIn(const G4ThreeVector &p, const G4ThreeVector &v) const
G4GeometryType GetEntityType() const
G4bool IsXLimited() const
virtual void AddSolid(const G4Box &)=0
#define G4MUTEX_INITIALIZER
G4bool CalculateExtent(const EAxis pAxis, const G4VoxelLimits &pVoxelLimit, const G4AffineTransform &pTransform, G4double &pmin, G4double &pmax) const
static double normal(HepRandomEngine *eptr)
std::vector< G4ThreeVector > GetVertices() const
G4double GetMaxXExtent() const
G4double GetMinZExtent() const
void DescribeYourselfTo(G4VGraphicsScene &scene) const
G4ThreeVector GetPointOnFace(G4ThreeVector p1, G4ThreeVector p2, G4ThreeVector p3, G4double &area) const
static G4bool CheckDegeneracy(G4ThreeVector anchor, G4ThreeVector p2, G4ThreeVector p3, G4ThreeVector p4)
std::vector< G4ThreeVector > G4ThreeVectorList
G4Polyhedron * CreatePolyhedron() const
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
G4double GetMinXExtent() const
G4double GetMaxZExtent() const
std::ostream & StreamInfo(std::ostream &os) const
T max(const T t1, const T t2)
brief Return the largest of the two arguments
G4double GetCubicVolume()
T min(const T t1, const T t2)
brief Return the smallest of the two arguments
G4double GetSurfaceArea()
EInside Inside(const G4ThreeVector &p) const
G4VisExtent GetExtent() const
G4double GetMaxYExtent() const
static const char CVSVers[]
G4VSolid & operator=(const G4VSolid &rhs)
G4int GetNumberOfRotationStepsAtTimeOfCreation() const
G4ThreeVectorList * CreateRotatedVertices(const G4AffineTransform &pTransform) const
G4Tet & operator=(const G4Tet &rhs)
void ComputeDimensions(G4VPVParameterisation *p, const G4int n, const G4VPhysicalVolume *pRep)
G4bool IsZLimited() const
G4Polyhedron * fpPolyhedron
G4Polyhedron * GetPolyhedron() const
G4Tet(const G4String &pName, G4ThreeVector anchor, G4ThreeVector p2, G4ThreeVector p3, G4ThreeVector p4, G4bool *degeneracyFlag=0)
G4ThreeVector SurfaceNormal(const G4ThreeVector &p) const