61 #if !defined(G4GEOM_USE_UTET)
63 const char G4Tet::CVSVers[]=
"$Id: G4Tet.cc 101118 2016-11-07 09:10:59Z gcosmo $";
88 using namespace CLHEP;
104 :
G4VSolid(pName), fRebuildPolyhedron(false), fpPolyhedron(0), warningFlag(0)
114 G4double signed_vol=fV21.cross(fV31).dot(fV41);
147 if(degeneracyFlag) *degeneracyFlag=degenerate;
151 "Degenerate tetrahedron not allowed.");
154 fTol=1e-9*(std::fabs(
fXMin)+std::fabs(fXMax)+std::fabs(fYMin)
155 +std::fabs(fYMax)+std::fabs(fZMin)+std::fabs(fZMax));
200 :
G4VSolid(a), fCubicVolume(0.), fSurfaceArea(0.),
201 fRebuildPolyhedron(false), fpPolyhedron(0),
202 fAnchor(0,0,0), fP2(0,0,0), fP3(0,0,0), fP4(0,0,0), fMiddle(0,0,0),
203 fNormal123(0,0,0), fNormal142(0,0,0), fNormal134(0,0,0),
204 fNormal234(0,0,0), warningFlag(0),
205 fCdotN123(0.), fCdotN142(0.), fCdotN134(0.), fCdotN234(0.),
206 fXMin(0.), fXMax(0.), fYMin(0.), fYMax(0.), fZMin(0.), fZMax(0.),
207 fDx(0.), fDy(0.), fDz(0.), fTol(0.), fMaxSize(0.)
226 fCubicVolume(rhs.fCubicVolume), fSurfaceArea(rhs.fSurfaceArea),
227 fRebuildPolyhedron(false), fpPolyhedron(0), fAnchor(rhs.fAnchor),
228 fP2(rhs.fP2), fP3(rhs.fP3), fP4(rhs.fP4), fMiddle(rhs.fMiddle),
229 fNormal123(rhs.fNormal123), fNormal142(rhs.fNormal142),
230 fNormal134(rhs.fNormal134), fNormal234(rhs.fNormal234),
231 warningFlag(rhs.warningFlag), fCdotN123(rhs.fCdotN123),
232 fCdotN142(rhs.fCdotN142), fCdotN134(rhs.fCdotN134),
233 fCdotN234(rhs.fCdotN234), fXMin(rhs.fXMin), fXMax(rhs.fXMax),
234 fYMin(rhs.fYMin), fYMax(rhs.fYMax), fZMin(rhs.fZMin), fZMax(rhs.fZMax),
235 fDx(rhs.fDx), fDy(rhs.fDy), fDz(rhs.fDz), fTol(rhs.fTol),
236 fMaxSize(rhs.fMaxSize)
249 if (
this == &rhs) {
return *
this; }
284 G4Tet *
object=
new G4Tet(
"temp",anchor,p2,p3,p4,&result);
311 if (pMin.x() >= pMax.x() || pMin.y() >= pMax.y() || pMin.z() >= pMax.z())
313 std::ostringstream message;
314 message <<
"Bad bounding box (min >= max) for solid: "
316 <<
"\npMin = " << pMin
317 <<
"\npMax = " << pMax;
340 if (
true)
return bbox.
CalculateExtent(pAxis,pVoxelLimit,pTransform,pMin,pMax);
344 return exist = (pMin < pMax) ?
true :
false;
352 anchor[0].set(vec[0].x(),vec[0].y(),vec[0].z());
355 base[0].set(vec[1].x(),vec[1].y(),vec[1].z());
356 base[1].set(vec[2].x(),vec[2].y(),vec[2].z());
357 base[2].set(vec[3].x(),vec[3].y(),vec[3].z());
359 std::vector<const G4ThreeVectorList *> polygons(2);
360 polygons[0] = &anchor;
439 if( noSurfaces == 1 )
445 return sumnorm.unit();
451 if( (r123<=r134) && (r123<=r142) && (r123<=r234) ) {
return fNormal123; }
452 else if ( (r134<=r142) && (r134<=r234) ) {
return fNormal134; }
475 if( (t>=-
fTol) && (t<tmin) )
477 hp=p+vu*(t+extraDistance);
491 if( (t>=-
fTol) && (t<tmin) )
493 hp=p+vu*(t+extraDistance);
507 if( (t>=-
fTol) && (t<tmin) )
509 hp=p+vu*(t+extraDistance);
523 if( (t>=-
fTol) && (t<tmin) )
525 hp=p+vu*(t+extraDistance);
592 std::ostringstream message;
593 message <<
"No good intersection found or already outside!?" <<
G4endl
594 <<
"p = " << p /
mm <<
"mm" <<
G4endl
596 <<
"t1, t2, t3, t4 (mm) "
597 << t1/
mm <<
", " << t2/
mm <<
", " << t3/
mm <<
", " << t4/
mm;
598 G4Exception(
"G4Tet::DistanceToOut(p,v,...)",
"GeomSolids1002",
605 else if(calcNorm && n)
613 if(validNorm) { *validNorm=
true; }
637 return (tmin <
fTol)? 0:tmin;
655 return new G4Tet(*
this);
664 G4int oldprc = os.precision(16);
665 os <<
"-----------------------------------------------------------\n"
666 <<
" *** Dump for solid - " <<
GetName() <<
" ***\n"
667 <<
" ===================================================\n"
668 <<
" Solid type: G4Tet\n"
671 <<
" p2: " <<
fP2/
mm <<
" mm \n"
672 <<
" p3: " <<
fP3/
mm <<
" mm \n"
673 <<
" p4: " <<
fP4/
mm <<
" mm \n"
678 <<
"-----------------------------------------------------------\n";
679 os.precision(oldprc);
703 area = 0.5*(v.cross(w)).mag();
705 return (p2 + lambda1*w + lambda2*v);
714 G4double chose,aOne,aTwo,aThree,aFour;
723 if( (chose>=0.) && (chose <aOne) ) {
return p1;}
724 else if( (chose>=aOne) && (chose < aOne+aTwo) ) {
return p2;}
725 else if( (chose>=aOne+aTwo) && (chose<aOne+aTwo+aThree) ) {
return p3;}
735 std::vector<G4ThreeVector> vertices(4);
790 const G4int faces[4][4]={{1,3,2,0},{1,4,3,0},{1,2,4,0},{2,3,4,0}};
792 xyz[1][0]=
fP2.x(); xyz[1][1]=
fP2.y(); xyz[1][2]=
fP2.z();
793 xyz[2][0]=
fP3.x(); xyz[2][1]=
fP3.y(); xyz[2][2]=
fP3.z();
794 xyz[3][0]=
fP4.x(); xyz[3][1]=
fP4.y(); xyz[3][2]=
fP4.z();
796 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 constexpr double mm
static const G4double kInfinity
CLHEP::Hep3Vector G4ThreeVector
G4ThreeVector GetPointOnSurface() const
std::vector< ExP01TrackerHit * > a
G4double DistanceToIn(const G4ThreeVector &p, const G4ThreeVector &v) const
G4GeometryType GetEntityType() 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
void DescribeYourselfTo(G4VGraphicsScene &scene) const
G4ThreeVector GetPointOnFace(G4ThreeVector p1, G4ThreeVector p2, G4ThreeVector p3, G4double &area) const
G4bool CalculateExtent(const EAxis pAxis, const G4VoxelLimits &pVoxelLimits, const G4Transform3D &pTransform3D, G4double &pMin, G4double &pMax) const
static G4bool CheckDegeneracy(G4ThreeVector anchor, G4ThreeVector p2, G4ThreeVector p3, G4ThreeVector p4)
G4bool BoundingBoxVsVoxelLimits(const EAxis pAxis, const G4VoxelLimits &pVoxelLimits, const G4Transform3D &pTransform3D, G4double &pMin, G4double &pMax) const
void Extent(G4ThreeVector &pMin, G4ThreeVector &pMax) const
std::vector< G4ThreeVector > G4ThreeVectorList
G4Polyhedron * CreatePolyhedron() const
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
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
static const char CVSVers[]
G4VSolid & operator=(const G4VSolid &rhs)
G4int GetNumberOfRotationStepsAtTimeOfCreation() const
G4Tet & operator=(const G4Tet &rhs)
void ComputeDimensions(G4VPVParameterisation *p, const G4int n, const G4VPhysicalVolume *pRep)
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