95 r[0] = tail->
r;
z[0] = tail->
z;
96 r[1] = head->
r;
z[1] = head->
z;
107 phiTotal = (
phiIsOpen) ? thePhiTotal : twopi;
132 b1(
r[1]*std::cos(phi),
r[1]*std::sin(phi),
z[1] ),
133 c1( prevRZ->
r*std::cos(phi), prevRZ->
r*std::sin(phi), prevRZ->
z ),
134 d1( nextRZ->
r*std::cos(phi), nextRZ->
r*std::sin(phi), nextRZ->
z ),
147 c2 =
G4ThreeVector( prevRZ->
r*std::cos(phi), prevRZ->
r*std::sin(phi), prevRZ->
z );
148 d2 =
G4ThreeVector( nextRZ->
r*std::cos(phi), nextRZ->
r*std::sin(phi), nextRZ->
z );
159 tt = b2 +
b1 - a2 -
a1;
163 tt = b2 -
b1 + a2 -
a1;
167 lenPhi[0] = 0.25*tt.mag();
192 adj = 0.5*(
c1+c2-a1-
a2);
193 adj = adj.cross(a12);
194 adj = adj.unit() + vec->
normal;
199 adj = adj.cross(a12);
200 adj = adj.unit() + vec->
normal;
208 vec->
edges[0] = edge;
212 vec->
edges[1] = edge;
240 edge = vec->
edges[0];
246 edge->
normal = eNorm.unit();
260 }
while( prev=vec, ++vec <
vecs + numSide );
277 normvec = normvec.cross(vec->
normal);
278 if (normvec.dot(vec->
surfPhi) > 0) normvec = -normvec;
290 vec =
vecs + numSide - 1;
293 normvec = normvec.cross(vec->
normal);
294 if (normvec.dot(vec->
surfPhi) < 0) normvec = -normvec;
318 : numSide(0), startPhi(0.), deltaPhi(0.), endPhi(0.),
319 phiIsOpen(false), allBehind(false), cone(0), vecs(0), edges(0),
320 lenRZ(0.), edgeNorm(0.), kCarTolerance(0.), fSurfaceArea(0.), instanceID(0)
356 if (
this == &source)
return *
this;
404 *sourceEdge = source.
edges;
408 }
while( ++sourceEdge, ++edge <
edges + numEdges);
416 *sourceVec = source.
vecs;
476 G4double normSign = outgoing ? +1 : -1;
516 if (dotProd <= 0)
continue;
522 distFromSurface = -normSign*delta.dot(vec->
normal);
524 if (distFromSurface < -surfTolerance)
continue;
538 if (normSign*qc.cross(qd).dot(v) < 0)
continue;
543 if (normSign*qa.cross(qb).dot(v) > 0)
continue;
550 if (
r[0] > 1/
kInfinity && normSign*qa.cross(qc).dot(v) < 0)
return false;
551 if (
r[1] > 1/
kInfinity && normSign*qb.cross(qd).dot(v) > 0)
return false;
558 if (distFromSurface < 0)
563 if (std::fabs(rz) >
lenRZ+surfTolerance)
return false;
566 if (std::fabs(pp) >
lenPhi[0] +
lenPhi[1]*rz + surfTolerance)
return false;
573 distance = distFromSurface/dotProd;
577 }
while( ++vec, ++face <
numSide );
588 G4double normSign = outgoing ? -1 : +1;
638 if ( (std::fabs(norm) < tolerance) && (*bestDistance < 2.0*tolerance) )
703 i1 = iPhi; i2 = iPhi;
718 G4double answer = (*vec)->dot(axis);
719 if (answer > best) best = answer;
720 }
while( ++vec < list+4 );
816 if (dotProd <= 0)
return false;
823 distFromSurface = -normSign*delta.dot(vec.
normal);
825 if (distFromSurface < -surfTolerance)
return false;
831 distance = distFromSurface/dotProd;
853 if (
r[0]==0)
return true;
855 if (atRZ < -
lenRZ*1.2)
return false;
861 if (normSign*qacb.dot(v) < 0)
return false;
863 if (distFromSurface < 0)
865 if (atRZ < -
lenRZ-surfTolerance)
return false;
870 if (
r[1]==0)
return true;
872 if (atRZ >
lenRZ*1.2)
return false;
878 if (normSign*qacb.dot(v) >= 0)
return false;
880 if (distFromSurface < 0)
882 if (atRZ >
lenRZ+surfTolerance)
return false;
912 *i1 =
PhiSegment( std::atan2( p.y() + s1*v.y(), p.x() + s1*v.x() ) );
915 return (*i1 < 0) ? 0 : 1;
921 *i2 =
PhiSegment( std::atan2( p.y() + s2*v.y(), p.x() + s2*v.x() ) );
922 if (*i1 == *i2)
return 0;
926 if (*i2 < 0)
return 0;
931 if (*i2 < 0)
return 1;
946 if (iPhi >= 0)
return iPhi;
954 while( phi <
startPhi ) phi += twopi;
957 while( phi >
startPhi ) phi -= twopi;
960 return (d2 < d1) ? 0 :
numSide-1;
978 while( phi < 0 ) phi += twopi;
979 while( phi > twopi ) phi -= twopi;
1045 *normDist = vec.
normal.dot(pct);
1090 if (pcDotRZ < -
lenRZ)
1097 if (pcDotPhi < -lenPhiZ)
1102 G4double distOutPhi = pcDotPhi+lenPhiZ;
1103 distOut2 = distOutPhi*distOutPhi + distOutZ*distOutZ;
1107 else if (pcDotPhi > lenPhiZ)
1112 G4double distOutPhi = pcDotPhi-lenPhiZ;
1113 distOut2 = distOutPhi*distOutPhi + distOutZ*distOutZ;
1123 distOut2 = distOutZ*distOutZ;
1124 *normDist = pa.dot(vec.
edgeNorm[0]);
1127 else if (pcDotRZ >
lenRZ)
1134 if (pcDotPhi < -lenPhiZ)
1139 G4double distOutPhi = pcDotPhi+lenPhiZ;
1140 distOut2 = distOutPhi*distOutPhi + distOutZ*distOutZ;
1144 else if (pcDotPhi > lenPhiZ)
1149 G4double distOutPhi = pcDotPhi-lenPhiZ;
1150 distOut2 = distOutPhi*distOutPhi + distOutZ*distOutZ;
1159 distOut2 = distOutZ*distOutZ;
1161 *normDist = pd.dot(vec.
edgeNorm[1]);
1170 if (pcDotPhi < -lenPhiZ)
1176 distOut2 = distOut*distOut;
1180 else if (pcDotPhi > lenPhiZ)
1186 distOut2 = distOut*distOut;
1195 return std::fabs(distFaceNorm);
1198 return std::sqrt( distFaceNorm*distFaceNorm + distOut2 );
1218 *p4=p2 + lambda1*w + lambda2*v;
1219 return 0.5*(v.cross(w)).mag();
1240 if( (chose>=0.) && (chose < aOne) )
1290 std::vector<G4double>areas;
1291 std::vector<G4ThreeVector>points;
1309 points.push_back(point1);
1310 areas.push_back(result1);
1318 Achose1=0;Achose2=0.;
1323 if(chose>=Achose1 && chose<Achose2)
1325 point1=points[i] ;
break;
1327 i++; Achose1=Achose2;
G4PolyhedraSideEdge * edges[2]
G4ThreeVector GetPointOnPlane(G4ThreeVector p0, G4ThreeVector p1, G4ThreeVector p2, G4ThreeVector p3, G4double *Area)
static c2_factory< G4double > c2
G4double GetPhi(const G4ThreeVector &p)
G4double Extent(const G4ThreeVector axis)
G4PolyhedraSide(const G4PolyhedraSideRZ *prevRZ, const G4PolyhedraSideRZ *tail, const G4PolyhedraSideRZ *head, const G4PolyhedraSideRZ *nextRZ, G4int numSide, G4double phiStart, G4double phiTotal, G4bool phiIsOpen, G4bool isAllBehind=false)
G4ThreeVector cornNorm[2]
static const G4double kInfinity
CLHEP::Hep3Vector G4ThreeVector
EInside Inside(const G4ThreeVector &p, G4double tolerance, G4double *bestDistance)
virtual ~G4PolyhedraSide()
G4int ClosestPhiSegment(G4double phi)
G4double DistanceToOneSide(const G4ThreeVector &p, const G4PolyhedraSideVec &vec, G4double *normDist)
G4ThreeVector edgeNorm[2]
static const G4PhSideManager & GetSubInstanceManager()
G4double GetSurfaceTolerance() const
void SetNormal(const G4ThreeVector &newNormal)
G4ThreeVector Normal(const G4ThreeVector &p, G4double *bestDistance)
virtual G4bool PartialClip(const G4VoxelLimits &voxelLimit, const EAxis IgnoreMe)
virtual void AddVertexInOrder(const G4ThreeVector vertex)
G4int LineHitsSegments(const G4ThreeVector &p, const G4ThreeVector &v, G4int *i1, G4int *i2)
G4int LineHitsCone(const G4ThreeVector &p, const G4ThreeVector &v, G4double *s1, G4double *s2)
G4int CreateSubInstance()
G4PolyhedraSideVec * vecs
static double normal(HepRandomEngine *eptr)
G4double DistanceAway(const G4ThreeVector &p, const G4PolyhedraSideVec &vec, G4double *normDist)
G4double Distance(const G4ThreeVector &p, G4bool outgoing)
G4double SurfaceTriangle(G4ThreeVector p1, G4ThreeVector p2, G4ThreeVector p3, G4ThreeVector *p4)
G4bool IntersectSidePlane(const G4ThreeVector &p, const G4ThreeVector &v, const G4PolyhedraSideVec &vec, G4double normSign, G4double surfTolerance, G4double &distance, G4double &distFromSurface)
void AddSurface(const G4ClippablePolygon &surface)
G4int PhiSegment(G4double phi)
static G4GEOM_DLL G4PhSideManager subInstanceManager
G4bool Intersect(const G4ThreeVector &p, const G4ThreeVector &v, G4bool outgoing, G4double surfTolerance, G4double &distance, G4double &distFromSurface, G4ThreeVector &normal, G4bool &allBehind)
G4ThreeVector GetPointOnFace()
void CopyStuff(const G4PolyhedraSide &source)
G4IntersectingCone * cone
G4PolyhedraSideEdge * edges
void CalculateExtent(const EAxis axis, const G4VoxelLimits &voxelLimit, const G4AffineTransform &tranform, G4SolidExtentList &extentList)
G4PolyhedraSide & operator=(const G4PolyhedraSide &source)
static G4GeometryTolerance * GetInstance()