60 fVertices =
new vector<G4ThreeVector>(3);
79 fArea = 0.5 * E1xE2.
mag();
80 for (
G4int i = 0; i < 3; ++i)
93 if (leng1 <= delta || leng2 <= delta || leng3 <= delta)
102 if (2.*fArea/std::max(std::max(leng1,leng2),leng3) <= delta)
112 ostringstream message;
113 message <<
"Facet is too small or too narrow." <<
G4endl
114 <<
"Triangle area = " << fArea <<
G4endl
118 <<
"Side1 length (P0->P1) = " << leng1 <<
G4endl
119 <<
"Side2 length (P1->P2) = " << leng2 <<
G4endl
120 <<
"Side3 length (P2->P0) = " << leng3;
121 G4Exception(
"G4TriangularFacet::G4TriangularFacet()",
123 fSurfaceNormal.set(0,0,0);
126 fCircumcentre = vt0 + 0.5*fE1 + 0.5*fE2;
127 fArea = fRadius = 0.0;
131 fSurfaceNormal = E1xE2.
unit();
135 fDet = std::fabs(fA*fC - fB*fB);
138 vt0 + (E1xE2.
cross(fE1)*fC + fE2.
cross(E1xE2)*fA) / (2.*E1xE2.
mag2());
139 fRadius = (fCircumcentre - vt0).mag();
147 fVertices =
new vector<G4ThreeVector>(3);
152 for (
G4int i = 0; i < 3; ++i)
157 fSurfaceNormal.set(0,0,0);
162 fArea = fRadius = 0.0;
176 auto p = (
char *) &rhs;
177 copy(p, p +
sizeof(*
this), (
char *)
this);
179 if (fIndices[0] < 0 && fVertices ==
nullptr)
181 fVertices =
new vector<G4ThreeVector>(3);
182 for (
G4int i = 0; i < 3; ++i)
184 (*fVertices)[i] = (*rhs.fVertices)[i];
193 fSurfaceNormal = std::move(rhs.fSurfaceNormal);
195 fCircumcentre = std::move(rhs.fCircumcentre);
196 fRadius = rhs.fRadius;
197 fIndices = rhs.fIndices;
198 fA = rhs.fA; fB = rhs.fB; fC = rhs.fC;
200 fSqrDist = rhs.fSqrDist;
201 fE1 = std::move(rhs.fE1); fE2 = std::move(rhs.fE2);
202 fIsDefined = rhs.fIsDefined;
203 fVertices = rhs.fVertices;
204 rhs.fVertices =
nullptr;
318 if (-d >= fA) {q = 1.0; fSqrDist = fA + 2.0*d + f;}
319 else {q = -d/fA; fSqrDist = d*q + f;}
324 if (e >= 0.0) {t = 0.0; fSqrDist = f;}
325 else if (-e >= fC) {t = 1.0; fSqrDist = fC + 2.0*e + f;}
326 else {t = -e/fC; fSqrDist = e*t + f;}
335 if (e >= 0.0) {t = 0.0; fSqrDist = f;}
336 else if (-e >= fC) {t = 1.0; fSqrDist = fC + 2.0*e + f;}
337 else {t = -e/fC; fSqrDist = e*t + f;}
346 if (d >= 0.0) {q = 0.0; fSqrDist = f;}
347 else if (-d >= fA) {q = 1.0; fSqrDist = fA + 2.0*d + f;}
348 else {q = -d/fA; fSqrDist = d*q + f;}
356 fSqrDist = dist*dist;
357 return fSurfaceNormal*dist;
373 if (numer >= denom) {q = 1.0; t = 0.0; fSqrDist = fA + 2.0*d + f;}
378 fSqrDist = q*(fA*q + fB*t +2.0*d) + t*(fB*q + fC*t + 2.0*e) + f;
384 if (tmp1 <= 0.0) {t = 1.0; fSqrDist = fC + 2.0*e + f;}
385 else if (e >= 0.0) {t = 0.0; fSqrDist = f;}
386 else {t = -e/fC; fSqrDist = e*t + f;}
400 if (numer >= denom) {t = 1.0; q = 0.0; fSqrDist = fC + 2.0*e + f;}
405 fSqrDist = q*(fA*q + fB*t +2.0*d) + t*(fB*q + fC*t + 2.0*e) + f;
411 if (tmp1 <= 0.0) {q = 1.0; fSqrDist = fA + 2.0*d + f;}
412 else if (d >= 0.0) {q = 0.0; fSqrDist = f;}
413 else {q = -d/fA; fSqrDist = d*q + f;}
426 fSqrDist = fC + 2.0*e + f;
431 if (numer >= denom) {q = 1.0; t = 0.0; fSqrDist = fA + 2.0*d + f;}
436 fSqrDist = q*(fA*q + fB*t + 2.0*d) + t*(fB*q + fC*t + 2.0*e) + f;
458 if (fSqrDist < 0.0) { fSqrDist = 0.; }
465 if (fSqrDist > u2) { fSqrDist = u2; }
489 if ((p-fCircumcentre).mag()-fRadius < minDist)
525 if ((p-fCircumcentre).mag()-fRadius < minDist)
534 G4bool wrongSide = (dir > 0.0 && !outgoing) || (dir < 0.0 && outgoing);
569 if (sp > ss) { ss = sp; }
571 if (sp > ss) { ss = sp; }
617 distance = kInfinity;
618 distFromSurface = kInfinity;
630 distFromSurface =
D.dot(fSurfaceNormal);
636 distance = kInfinity;
637 distFromSurface = kInfinity;
642 wrongSide = (outgoing && distFromSurface < 0.0)
643 || (!outgoing && distFromSurface > 0.0);
659 normal = fSurfaceNormal;
668 distance = kInfinity;
669 distFromSurface = kInfinity;
697 vprime, P0prime, E0prime, E1prime, loc))
705 G4double s0 = (loc[0] - pprime).mag()/vprimemag;
706 G4double s1 = (loc[1] - pprime).mag()/vprimemag;
707 G4double normDist0 = fSurfaceNormal.dot(s0*v) - distFromSurface;
708 G4double normDist1 = fSurfaceNormal.dot(s1*v) - distFromSurface;
710 if ((normDist0 < 0.0 && normDist1 < 0.0)
711 || (normDist0 > 0.0 && normDist1 > 0.0)
712 || (normDist0 == 0.0 && normDist1 == 0.0) )
714 distance = kInfinity;
715 distFromSurface = kInfinity;
720 G4double dnormDist = normDist1 - normDist0;
724 normal = fSurfaceNormal;
725 if (!outgoing) { distFromSurface = -distFromSurface; }
729 distance = s0 - normDist0*(s1-s0)/dnormDist;
730 normal = fSurfaceNormal;
731 if (!outgoing) { distFromSurface = -distFromSurface; }
734 distance = kInfinity;
735 distFromSurface = kInfinity;
746 distance = distFromSurface / w;
759 if (ss < -sTolerance || t < -tTolerance || ( ss+t - fDet ) > detTolerance)
764 distance = distFromSurface = kInfinity;
772 normal = fSurfaceNormal;
773 if (!outgoing) { distFromSurface = -distFromSurface; }
810 return "G4TriangularFacet";
817 return fSurfaceNormal;
824 fSurfaceNormal = normal;
G4double D(G4double temp)
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
G4double G4QuickRand(uint32_t seed=0)
CLHEP::Hep3Vector G4ThreeVector
CLHEP::Hep2Vector G4TwoVector
Hep3Vector cross(const Hep3Vector &) const
double dot(const Hep3Vector &) const
void set(double x, double y, double z)
static G4bool IntersectLineAndTriangle2D(const G4TwoVector &p, const G4TwoVector &v, const G4TwoVector &p0, const G4TwoVector &e0, const G4TwoVector &e1, G4TwoVector location[2])
G4TriangularFacet defines a facet with 3 vertices, used for the contruction of G4TessellatedSolid....
G4GeometryType GetEntityType() const override
G4double Extent(const G4ThreeVector axis) override
void SetVertex(G4int i, const G4ThreeVector &val) override
G4ThreeVector GetSurfaceNormal() const override
G4ThreeVector GetVertex(G4int i) const override
G4bool Intersect(const G4ThreeVector &p, const G4ThreeVector &v, const G4bool outgoing, G4double &distance, G4double &distFromSurface, G4ThreeVector &normal) override
~G4TriangularFacet() override
G4TriangularFacet & operator=(const G4TriangularFacet &right)
void SetVertices(std::vector< G4ThreeVector > *v) override
G4ThreeVector GetPointOnFace() const override
G4TriangularFacet * GetFlippedFacet()
G4ThreeVector Distance(const G4ThreeVector &p)
G4VFacet * GetClone() override
void SetSurfaceNormal(const G4ThreeVector &normal)
G4double GetArea() const override
static const G4double dirTolerance
const axis_t axis_to_type< N >::axis