55 fTAlph = std::tan(fAlpha) ;
59 fdeltaX = 2 * fDz * std::tan(fTheta) * std::cos(fPhi) ;
61 fdeltaY = 2 * fDz * std::tan(fTheta) * std::sin(fPhi) ;
64 fPhiTwist = PhiTwist ;
96 :
G4VTwistSurface(a), fDx1(0.), fDx2(0.), fDy(0.), fDz(0.), fPhiTwist(0.),
97 fAlpha(0.), fTAlph(0.), fPhi(0.), fTheta(0.), fdeltaX(0.), fdeltaY(0.)
151 for (
auto i=0; i<2; ++i)
153 distance[i] = kInfinity;
156 gxx[i].
set(kInfinity, kInfinity, kInfinity);
168 if (std::fabs(p.
z()) == 0.)
204 isvalid[0], 0, validate, &gp, &gv);
208 distance[0] = - (p.
z() / v.
z());
218 if (distance[0] >= 0) isvalid[0] =
true;
226 if (distance[0] >= 0) isvalid[0] =
true;
232 if (distance[0] >= 0) isvalid[0] =
true;
236 isvalid[0], 1, validate, &gp, &gv);
239 G4cerr <<
"ERROR - G4TwistTrapFlatSide::DistanceToSurface(p,v)" <<
G4endl;
276 for (
auto i=0; i<2; ++i)
278 distance[i] = kInfinity;
280 gxx[i].
set(kInfinity, kInfinity, kInfinity);
296 distance[0] = std::fabs(p.
z());
297 xx.
set(p.
x(), p.
y(), 0);
323 G4double wmax = xAxisMax(xx.
y(), fTAlph ) ;
324 G4double wmin = -xAxisMax(xx.
y(), -fTAlph ) ;
332 if (xx.
x() < wmin + ctol)
335 if (xx.
x() <= wmin - ctol) isoutside =
true;
338 else if (xx.
x() > wmax - ctol)
341 if (xx.
x() >= wmax + ctol) isoutside =
true;
352 if (xx.
y() <=
fAxisMin[yaxis] - ctol) isoutside =
true;
355 else if (xx.
y() >
fAxisMax[yaxis] - ctol)
361 if (xx.
y() >=
fAxisMax[yaxis] + ctol) isoutside =
true;
369 G4int tmpareacode = areacode & (~sInside);
370 areacode = tmpareacode;
385 else if (xx.
x() > wmax)
417 "Feature NOT implemented !");
426void G4TwistTrapFlatSide::SetCorners()
435 x = -fDx1 + fDy * fTAlph ;
441 x = fDx1 + fDy * fTAlph ;
447 x = fDx2 - fDy * fTAlph ;
453 x = -fDx2 - fDy * fTAlph ;
461 std::ostringstream message;
462 message <<
"Feature NOT implemented !" <<
G4endl
464 <<
" fAxis[1] = " <<
fAxis[1];
473void G4TwistTrapFlatSide::SetBoundaries()
484 direction = direction.
unit();
490 direction = direction.
unit();
496 direction = direction.
unit();
502 direction = direction.
unit();
509 std::ostringstream message;
510 message <<
"Feature NOT implemented !" <<
G4endl
512 <<
" fAxis[1] = " <<
fAxis[1];
534 for (
G4int i = 0 ; i<n ; ++i )
536 y = -fDy + i*(2*fDy)/(n-1) ;
538 for (
G4int j = 0 ; j<k ; ++j )
542 x = xmin + j*(xmax-xmin)/(k-1) ;
544 nnode =
GetNode(i,j,k,n,iside) ;
547 xyz[nnode][0] = p.
x() ;
548 xyz[nnode][1] = p.
y() ;
549 xyz[nnode][2] = p.
z() ;
551 if ( i<n-1 && j<k-1 )
553 nface =
GetFace(i,j,k,n,iside) ;
558 * (
GetNode(i ,j ,k,n,iside)+1) ;
560 * (
GetNode(i+1,j ,k,n,iside)+1) ;
562 * (
GetNode(i+1,j+1,k,n,iside)+1) ;
564 * (
GetNode(i ,j+1,k,n,iside)+1) ;
569 * (
GetNode(i ,j ,k,n,iside)+1) ;
571 * (
GetNode(i ,j+1,k,n,iside)+1) ;
573 * (
GetNode(i+1,j+1,k,n,iside)+1) ;
575 * (
GetNode(i+1,j ,k,n,iside)+1) ;
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
G4GLOB_DLL std::ostream G4cerr
void set(double x, double y, double z)
HepRotation & rotateZ(double delta)
virtual G4int GetAreaCode(const G4ThreeVector &xx, G4bool withTol=true)
virtual void GetFacets(G4int m, G4int n, G4double xyz[][3], G4int faces[][4], G4int iside)
virtual G4ThreeVector GetNormal(const G4ThreeVector &, G4bool isGlobal=false)
virtual G4double GetBoundaryMin(G4double u)
virtual G4double GetBoundaryMax(G4double u)
virtual G4ThreeVector SurfacePoint(G4double x, G4double y, G4bool isGlobal=false)
G4TwistTrapFlatSide(const G4String &name, G4double PhiTwist, G4double pDx1, G4double pDx2, G4double pDy, G4double pDz, G4double pAlpha, G4double pPhi, G4double pTheta, G4int handedness)
virtual G4int DistanceToSurface(const G4ThreeVector &gp, const G4ThreeVector &gv, G4ThreeVector gxx[], G4double distance[], G4int areacode[], G4bool isvalid[], EValidate validate=kValidateWithTol)
virtual ~G4TwistTrapFlatSide()
G4int GetAreacode(G4int i) const
G4double GetDistance(G4int i) const
G4bool IsValid(G4int i) const
void SetCurrentStatus(G4int i, G4ThreeVector &xx, G4double &dist, G4int &areacode, G4bool &isvalid, G4int nxx, EValidate validate, const G4ThreeVector *p, const G4ThreeVector *v=nullptr)
G4ThreeVector GetXX(G4int i) const
void ResetfDone(EValidate validate, const G4ThreeVector *p, const G4ThreeVector *v=nullptr)
static const G4int sC0Min1Min
static const G4int sC0Min1Max
G4int GetNode(G4int i, G4int j, G4int m, G4int n, G4int iside)
static const G4int sOutside
G4ThreeVector ComputeGlobalDirection(const G4ThreeVector &lp) const
static const G4int sAxisMax
static const G4int sAxis0
G4int GetFace(G4int i, G4int j, G4int m, G4int n, G4int iside)
G4int GetEdgeVisibility(G4int i, G4int j, G4int m, G4int n, G4int number, G4int orientation)
G4ThreeVector ComputeLocalDirection(const G4ThreeVector &gp) const
static const G4int sAxisMin
static const G4int sC0Max1Max
static const G4int sAxis1
G4bool IsInside(G4int areacode, G4bool testbitmode=false) const
virtual void SetBoundary(const G4int &axiscode, const G4ThreeVector &direction, const G4ThreeVector &x0, const G4int &boundarytype)
G4ThreeVector ComputeLocalPoint(const G4ThreeVector &gp) const
void SetCorner(G4int areacode, G4double x, G4double y, G4double z)
G4ThreeVector GetCorner(G4int areacode) const
static const G4int sBoundary
G4bool IsOutside(G4int areacode) const
static const G4int sCorner
static const G4int sC0Max1Min
static const G4int sInside
virtual G4String GetName() const
CurrentStatus fCurStatWithV
static const G4int sAxisY
static const G4int sAxisX
G4ThreeVector ComputeGlobalPoint(const G4ThreeVector &lp) const
G4SurfCurNormal fCurrentNormal