65 : fSurfaceArea(0.), triangles(0)
79 G4bool start = (phiOther > phi);
100 G4double midPhi = phi + (start ? +0.5 : -0.5)*deltaPhi;
102 sinMid = std::sin(midPhi);
119 corn->
r = iterRZ.
GetA();
120 corn->
z = iterRZ.
GetB();
129 { corn->
prev = helper; }
134 { corn->
next = corn+1;}
139 }
while( ++corn, iterRZ.
Next() );
149 G4double rFact = std::cos(0.5*deltaPhi);
150 G4double rFactNormalize = 1.0/std::sqrt(1.0+rFact*rFact);
163 dz = here->z - prev->
z;
165 edge->
length = std::sqrt( dr*dr + dz*dz );
177 G4double zSignOther = start ? -1 : 1;
179 -zSignOther*std::cos(phiOther), 0 );
186 sideNorm *= rFactNormalize;
191 }
while( edge++, prev=here, ++here <
corners+numEdges );
205 G4double norm = std::sqrt( rPart*rPart + zPart*zPart );
229 G4double zSignOther = start ? -1 : 1;
231 -zSignOther*std::cos(phiOther), 0 );
233 xyVector = -
normal - normalOther;
253 }
while( prevEdge=edge, ++edge <
edges+numEdges );
278 test -= 1E-6*corner->
norm3D;
281 G4Exception(
"G4PolyPhiFace::Diagnose()",
"GeomSolids0002",
292 : numEdges(0), edges(0), corners(0), rMin(0.), rMax(0.), zMin(0.), zMax(0.),
293 allBehind(false),
kCarTolerance(0.), fSurfaceArea(0.), triangles(0)
323 if (
this == &source) {
return *
this; }
375 *sourceEdge = source.
edges;
381 }
while( ++sourceEdge, ++edge, prev=here, ++here <
corners+numEdges );
397 G4double normSign = outgoing ? +1 : -1;
411 if (dotProd <= 0)
return false;
418 distFromSurface = -normSign*ps.
dot(
normal);
420 if (distFromSurface < -surfTolerance)
return false;
426 distance = distFromSurface/dotProd;
447 G4double normSign = outgoing ? +1 : -1;
456 else if (distPhi < 0)
481 return std::sqrt( distPhi*distPhi + distRZ2 );
512 if (
InsideEdges( r, p.
z(), &distRZ2, &base3Dnorm, &head3Dnorm ))
517 *bestDistance = std::fabs(distPhi);
522 if (distPhi < -tolerance)
return kInside;
523 if (distPhi < tolerance)
return kSurface;
532 *bestDistance = std::sqrt( distPhi*distPhi + distRZ2 );
542 if ( distRZ2 > tolerance*tolerance )
550 if (normDist < -tolerance)
return kInside;
551 if (normDist < tolerance)
return kSurface;
587 *bestDistance = std::fabs(distPhi);
594 *bestDistance = std::sqrt( distPhi*distPhi + distRZ2 );
615 + axis.
z()*corner->
z;
616 if (here > max) max = here;
710 prevZ =
ExactZOrder( z, qx, qy, qz, v, normSign, prev );
716 cornZ =
ExactZOrder( z, qx, qy, qz, v, normSign, corn );
720 if (prevZ < 0)
continue;
724 if (prevZ > 0)
continue;
733 if (prevZ == 0)
continue;
750 nextZ =
ExactZOrder( z, qx, qy, qz, v, normSign, next );
751 }
while( nextZ == 0 );
756 if (nextZ*prevZ < 0)
continue;
765 G4ThreeVector qa( qx - prev->x, qy - prev->y, qz - prev->z ),
766 qb( qx - corn->
x, qy - corn->
y, qz - corn->
z );
768 G4double aboveOrBelow = normSign*qa.cross(qb).dot(v);
770 if (aboveOrBelow > 0)
772 else if (aboveOrBelow < 0)
783 }
while( prevZ = cornZ, prev=corn, ++corn <
corners+numEdges );
821 if ( r < rMin || r >
rMax )
return false;
822 if ( z < zMin || z >
zMax )
return false;
856 G4double distance2 = distOut*distOut;
857 if (distance2 > bestDistance2)
continue;
872 else if (q > edge->
length)
886 if (distance2 < bestDistance2)
888 bestDistance2 = distance2;
892 answer = (distNorm <= 0);
895 *base3Dnorm = testMe;
896 *head3Dnorm = &testMe->
norm3D;
901 answer = (distOut <= 0);
904 *base3Dnorm = edge->
v0;
905 *head3Dnorm = &edge->
norm3D;
911 *bestDist2 = bestDistance2;
931 *p4=p2 + lambda1*w + lambda2*v;
932 return 0.5*(v.cross(w)).mag();
964 return ((b.
x()-a.
x())*(c.
y()-a.
y())-
965 (c.
x()-a.
x())*(b.
y()-a.
y()));
975 return Area2(a,b,c)>0;
985 return Area2(a,b,c)>=0;
995 return Area2(a,b,c)==0;
1010 Positive = !(
Left(a,b,c))^!(
Left(a,b,d));
1011 return Positive && (!
Left(c,d,a)^!
Left(c,d,b));
1020 if( !
Collinear(a,b,c) ) {
return false; }
1024 return ((a.
x()<=c.
x())&&(c.
x()<=b.
x()))||
1025 ((a.
x()>=c.
x())&&(c.
x()>=b.
x()));
1029 return ((a.
y()<=c.
y())&&(c.
y()<=b.
y()))||
1030 ((a.
y()>=c.
y())&&(c.
y()>=b.
y()));
1066 corner_next=corner->
next;
1070 if( (corner!=a)&&(corner_next!=a)
1071 &&(corner!=b)&&(corner_next!=b) )
1078 if(
Intersect(rz1,rz2,rz3,rz4) ) {
return false; }
1080 corner=corner->
next;
1104 if(
LeftOn(arz,arz1,arz0))
1106 return Left(arz,brz,arz0)&&
Left(brz,arz,arz1);
1136 c_next=corner->
next;
1137 c_prev=corner->
prev;
1142 corner=corner->
next;
1160 std::vector<G4double> areas;
1161 std::vector<G4ThreeVector> points;
1172 triang->
r = helper->
r;
1173 triang->
z = helper->
z;
1174 triang->
x = helper->
x;
1175 triang->
y= helper->
y;
1182 { triang->
prev=helper2; }
1187 { triang->
next=triang+1; }
1191 helper=helper->
next;
1192 triang=triang->
next;
1224 points.push_back(p4);
1225 areas.push_back(result1);
1253 "Maximum number of steps is reached for triangulation!" );
1266 points.push_back(p4);
1267 areas.push_back(result1);
1282 Achose1=0; Achose2=0.;
1287 if(chose>=Achose1 && chose<Achose2)
1294 i++; Achose1=Achose2;
G4double ExactZOrder(G4double z, G4double qx, G4double qy, G4double qz, const G4ThreeVector &v, G4double normSign, const G4PolyPhiFaceVertex *vert) const
G4bool InsideEdgesExact(G4double r, G4double z, G4double normSign, const G4ThreeVector &p, const G4ThreeVector &v)
static const G4double kInfinity
G4ThreeVector surface_point
CLHEP::Hep3Vector G4ThreeVector
double dot(const Hep3Vector &) const
G4double GetSurfaceTolerance() const
void SetNormal(const G4ThreeVector &newNormal)
virtual G4bool PartialClip(const G4VoxelLimits &voxelLimit, const EAxis IgnoreMe)
virtual void AddVertexInOrder(const G4ThreeVector vertex)
G4bool Between(G4TwoVector a, G4TwoVector b, G4TwoVector c)
void Diagnose(G4VSolid *solid)
G4bool InsideEdges(G4double r, G4double z)
G4bool LeftOn(G4TwoVector a, G4TwoVector b, G4TwoVector c)
G4bool Intersect(const G4ThreeVector &p, const G4ThreeVector &v, G4bool outgoing, G4double surfTolerance, G4double &distance, G4double &distFromSurface, G4ThreeVector &normal, G4bool &allBehind)
G4int NumVertices() const
virtual EInside Inside(const G4ThreeVector &p) const =0
G4double SurfaceTriangle(G4ThreeVector p1, G4ThreeVector p2, G4ThreeVector p3, G4ThreeVector *p4)
EInside Inside(const G4ThreeVector &p, G4double tolerance, G4double *bestDistance)
G4PolyPhiFaceVertex * next
void AddSurface(const G4ClippablePolygon &surface)
G4PolyPhiFaceVertex * prev
const G4double kCarTolerance
void CalculateExtent(const EAxis axis, const G4VoxelLimits &voxelLimit, const G4AffineTransform &tranform, G4SolidExtentList &extentList)
G4double Distance(const G4ThreeVector &p, G4bool outgoing)
G4PolyPhiFaceVertex * corners
G4bool Collinear(G4TwoVector a, G4TwoVector b, G4TwoVector c)
G4bool Diagonalie(G4PolyPhiFaceVertex *a, G4PolyPhiFaceVertex *b)
G4PolyPhiFace & operator=(const G4PolyPhiFace &source)
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
G4ThreeVector Normal(const G4ThreeVector &p, G4double *bestDistance)
G4ThreeVector GetPointOnFace()
G4double Extent(const G4ThreeVector axis)
G4bool InCone(G4PolyPhiFaceVertex *a, G4PolyPhiFaceVertex *b)
G4PolyPhiFaceVertex * triangles
G4bool IntersectProp(G4TwoVector a, G4TwoVector b, G4TwoVector c, G4TwoVector d)
T max(const T t1, const T t2)
brief Return the largest of the two arguments
G4double Area2(G4TwoVector a, G4TwoVector b, G4TwoVector c)
G4bool Diagonal(G4PolyPhiFaceVertex *a, G4PolyPhiFaceVertex *b)
G4PolyPhiFace(const G4ReduciblePolygon *rz, G4double phi, G4double deltaPhi, G4double phiOther)
CLHEP::Hep2Vector G4TwoVector
static constexpr double ps
void CopyStuff(const G4PolyPhiFace &source)
static G4GeometryTolerance * GetInstance()
G4bool Left(G4TwoVector a, G4TwoVector b, G4TwoVector c)
G4PolyPhiFaceEdge * edges