G4QuadrangularFacet Class Reference

#include <G4QuadrangularFacet.hh>

Inheritance diagram for G4QuadrangularFacet:

G4VFacet

Public Member Functions

 G4QuadrangularFacet (const G4ThreeVector &Pt0, const G4ThreeVector &vt1, const G4ThreeVector &vt2, const G4ThreeVector &vt3, G4FacetVertexType)
 G4QuadrangularFacet (const G4QuadrangularFacet &right)
 ~G4QuadrangularFacet ()
G4QuadrangularFacetoperator= (const G4QuadrangularFacet &right)
G4VFacetGetClone ()
G4ThreeVector Distance (const G4ThreeVector &p)
G4double Distance (const G4ThreeVector &p, G4double minDist)
G4double Distance (const G4ThreeVector &p, G4double minDist, const G4bool outgoing)
G4double Extent (const G4ThreeVector axis)
G4bool Intersect (const G4ThreeVector &p, const G4ThreeVector &v, const G4bool outgoing, G4double &distance, G4double &distFromSurface, G4ThreeVector &normal)
G4ThreeVector GetSurfaceNormal () const
G4double GetArea ()
G4ThreeVector GetPointOnFace () const
G4GeometryType GetEntityType () const
G4bool IsDefined () const
G4int GetNumberOfVertices () const
G4ThreeVector GetVertex (G4int i) const
void SetVertex (G4int i, const G4ThreeVector &val)
void SetVertices (std::vector< G4ThreeVector > *v)
G4double GetRadius () const
G4ThreeVector GetCircumcentre () const

Detailed Description

Definition at line 69 of file G4QuadrangularFacet.hh.


Constructor & Destructor Documentation

G4QuadrangularFacet::G4QuadrangularFacet ( const G4ThreeVector Pt0,
const G4ThreeVector vt1,
const G4ThreeVector vt2,
const G4ThreeVector vt3,
G4FacetVertexType   
)

Definition at line 54 of file G4QuadrangularFacet.cc.

References ABSOLUTE, G4cout, G4endl, G4Exception(), G4TriangularFacet::GetSurfaceNormal(), GetVertex(), JustWarning, G4VFacet::kCarTolerance, G4TriangularFacet::SetSurfaceNormal(), and SetVertex().

Referenced by GetClone().

00059 {
00060   G4ThreeVector e1, e2, e3;
00061 
00062   SetVertex(0, vt0);
00063   if (vertexType == ABSOLUTE)
00064   {
00065     SetVertex(1, vt1);
00066     SetVertex(2, vt2);
00067     SetVertex(3, vt3);
00068 
00069     e1 = vt1 - vt0;
00070     e2 = vt2 - vt0;
00071     e3 = vt3 - vt0;
00072   }
00073   else
00074   {
00075     SetVertex(1, vt0 + vt1);
00076     SetVertex(2, vt0 + vt2);
00077     SetVertex(3, vt0 + vt3);
00078 
00079     e1 = vt1;
00080     e2 = vt2;
00081     e3 = vt3;
00082   }
00083   G4double length1 = e1.mag();
00084   G4double length2 = (GetVertex(2)-GetVertex(1)).mag();
00085   G4double length3 = (GetVertex(3)-GetVertex(2)).mag();
00086   G4double length4 = e3.mag();
00087 
00088   G4ThreeVector normal1 = e1.cross(e2).unit();
00089   G4ThreeVector normal2 = e2.cross(e3).unit(); 
00090 
00091   bool isDefined = (length1 > kCarTolerance && length2 > kCarTolerance &&
00092     length3 > kCarTolerance && length4 > kCarTolerance &&
00093     normal1.dot(normal2) >= 0.9999999999);
00094 
00095   if (isDefined)
00096   {
00097     fFacet1 = G4TriangularFacet (GetVertex(0),GetVertex(1),
00098                                  GetVertex(2),ABSOLUTE);
00099     fFacet2 = G4TriangularFacet (GetVertex(0),GetVertex(2),
00100                                  GetVertex(3),ABSOLUTE);
00101 
00102     G4TriangularFacet facet3 (GetVertex(0),GetVertex(1),GetVertex(3),ABSOLUTE);
00103     G4TriangularFacet facet4 (GetVertex(1),GetVertex(2),GetVertex(3),ABSOLUTE);
00104 
00105     G4ThreeVector normal12 = fFacet1.GetSurfaceNormal()
00106                            + fFacet2.GetSurfaceNormal();
00107     G4ThreeVector normal34 = facet3.GetSurfaceNormal()
00108                            + facet4.GetSurfaceNormal();
00109     G4ThreeVector normal = 0.25 * (normal12 + normal34);
00110 
00111     fFacet1.SetSurfaceNormal (normal);
00112     fFacet2.SetSurfaceNormal (normal);
00113 
00114     G4ThreeVector vtmp = 0.5 * (e1 + e2);
00115     fCircumcentre = GetVertex(0) + vtmp;
00116     G4double radiusSqr = vtmp.mag2();
00117     fRadius = std::sqrt(radiusSqr);
00118   }
00119   else
00120   {
00121     G4Exception("G4QuadrangularFacet::G4QuadrangularFacet()",
00122                 "GeomSolids0002", JustWarning,
00123                 "Length of sides of facet are too small or sides not planar.");
00124     G4cout << G4endl;
00125     G4cout << "P0 = " << GetVertex(0) << G4endl;
00126     G4cout << "P1 = " << GetVertex(1) << G4endl;
00127     G4cout << "P2 = " << GetVertex(2) << G4endl;
00128     G4cout << "P3 = " << GetVertex(3) << G4endl;
00129     G4cout << "Side lengths = P0->P1" << length1 << G4endl;    
00130     G4cout << "Side lengths = P1->P2" << length2 << G4endl;    
00131     G4cout << "Side lengths = P2->P3" << length3 << G4endl;    
00132     G4cout << "Side lengths = P3->P0" << length4 << G4endl;    
00133     G4cout << G4endl;
00134     fRadius = 0.0;
00135   }
00136 }

G4QuadrangularFacet::G4QuadrangularFacet ( const G4QuadrangularFacet right  ) 

Definition at line 146 of file G4QuadrangularFacet.cc.

References fFacet1, and fFacet2.

00147   : G4VFacet(rhs)
00148 {
00149   fFacet1 = rhs.fFacet1;
00150   fFacet2 = rhs.fFacet2;
00151   fRadius = 0.0;
00152 }

G4QuadrangularFacet::~G4QuadrangularFacet (  ) 

Definition at line 140 of file G4QuadrangularFacet.cc.

00141 {
00142 }


Member Function Documentation

G4double G4QuadrangularFacet::Distance ( const G4ThreeVector p,
G4double  minDist,
const G4bool  outgoing 
) [virtual]

Implements G4VFacet.

Definition at line 201 of file G4QuadrangularFacet.cc.

References G4VFacet::dirTolerance, Distance(), and GetSurfaceNormal().

00203 {
00204   G4double dist;
00205 
00206   G4ThreeVector v = Distance(p);
00207   G4double dir = v.dot(GetSurfaceNormal());
00208   if ( ((dir > dirTolerance) && (!outgoing))
00209     || ((dir < -dirTolerance) && outgoing))
00210     dist = kInfinity;
00211   else 
00212     dist = v.mag();
00213   return dist;
00214 }

G4double G4QuadrangularFacet::Distance ( const G4ThreeVector p,
G4double  minDist 
) [virtual]

Implements G4VFacet.

Definition at line 192 of file G4QuadrangularFacet.cc.

References Distance().

00194 {  
00195   G4double dist = Distance(p).mag();
00196   return dist;
00197 }

G4ThreeVector G4QuadrangularFacet::Distance ( const G4ThreeVector p  ) 

Definition at line 181 of file G4QuadrangularFacet.cc.

References G4TriangularFacet::Distance().

Referenced by Distance().

00182 {
00183   G4ThreeVector v1 = fFacet1.Distance(p);
00184   G4ThreeVector v2 = fFacet2.Distance(p);
00185 
00186   if (v1.mag2() < v2.mag2()) return v1;
00187   else return v2;
00188 }

G4double G4QuadrangularFacet::Extent ( const G4ThreeVector  axis  )  [virtual]

Implements G4VFacet.

Definition at line 218 of file G4QuadrangularFacet.cc.

References GetVertex(), and G4InuclParticleNames::sp.

00219 {
00220   G4double ss  = 0;
00221 
00222   for (G4int i = 0; i <= 3; ++i)
00223   {
00224     G4double sp = GetVertex(i).dot(axis);
00225     if (sp > ss) ss = sp;
00226   }
00227   return ss;
00228 }

G4double G4QuadrangularFacet::GetArea (  )  [virtual]

Implements G4VFacet.

Definition at line 266 of file G4QuadrangularFacet.cc.

References G4TriangularFacet::GetArea().

00267 {
00268   G4double area = fFacet1.GetArea() + fFacet2.GetArea();
00269   return area;
00270 }

G4ThreeVector G4QuadrangularFacet::GetCircumcentre (  )  const [inline, virtual]

Implements G4VFacet.

Definition at line 142 of file G4QuadrangularFacet.hh.

00143 {
00144   return fCircumcentre;
00145 }

G4VFacet * G4QuadrangularFacet::GetClone (  )  [virtual]

Implements G4VFacet.

Definition at line 171 of file G4QuadrangularFacet.cc.

References ABSOLUTE, G4QuadrangularFacet(), and GetVertex().

00172 {
00173   G4QuadrangularFacet *c = new G4QuadrangularFacet (GetVertex(0), GetVertex(1),
00174                                                     GetVertex(2), GetVertex(3),
00175                                                     ABSOLUTE);
00176   return c;
00177 }

G4String G4QuadrangularFacet::GetEntityType (  )  const [virtual]

Implements G4VFacet.

Definition at line 274 of file G4QuadrangularFacet.cc.

00275 {
00276   return "G4QuadrangularFacet";
00277 }

G4int G4QuadrangularFacet::GetNumberOfVertices (  )  const [inline, virtual]

Implements G4VFacet.

Definition at line 126 of file G4QuadrangularFacet.hh.

00127 {
00128   return 4;
00129 }

G4ThreeVector G4QuadrangularFacet::GetPointOnFace (  )  const [virtual]

Implements G4VFacet.

Definition at line 255 of file G4QuadrangularFacet.cc.

References G4TriangularFacet::GetPointOnFace().

00256 {
00257   G4ThreeVector pr = (G4RandFlat::shoot(0.,1.) < 0.5)
00258                    ? fFacet1.GetPointOnFace() : fFacet2.GetPointOnFace();
00259   return pr;
00260 }

G4double G4QuadrangularFacet::GetRadius (  )  const [inline, virtual]

Implements G4VFacet.

Definition at line 137 of file G4QuadrangularFacet.hh.

00138 {
00139   return fRadius;
00140 }

G4ThreeVector G4QuadrangularFacet::GetSurfaceNormal (  )  const [virtual]

Implements G4VFacet.

Definition at line 281 of file G4QuadrangularFacet.cc.

References G4TriangularFacet::GetSurfaceNormal().

Referenced by Distance().

00282 {
00283   return fFacet1.GetSurfaceNormal();
00284 }

G4ThreeVector G4QuadrangularFacet::GetVertex ( G4int  i  )  const [inline, virtual]

Implements G4VFacet.

Definition at line 131 of file G4QuadrangularFacet.hh.

References G4TriangularFacet::GetVertex().

Referenced by Extent(), G4QuadrangularFacet(), and GetClone().

00132 {
00133   return i == 3 ? fFacet2.GetVertex(2) : fFacet1.GetVertex(i);
00134 }

G4bool G4QuadrangularFacet::Intersect ( const G4ThreeVector p,
const G4ThreeVector v,
const G4bool  outgoing,
G4double distance,
G4double distFromSurface,
G4ThreeVector normal 
) [virtual]

Implements G4VFacet.

Definition at line 232 of file G4QuadrangularFacet.cc.

References G4TriangularFacet::Intersect().

00238 {
00239   G4bool intersect =
00240     fFacet1.Intersect(p,v,outgoing,distance,distFromSurface,normal);
00241   if (!intersect) intersect =
00242     fFacet2.Intersect(p,v,outgoing,distance,distFromSurface,normal);
00243   if (!intersect)
00244   {
00245     distance = distFromSurface = kInfinity;
00246     normal.set(0,0,0);
00247   }
00248   return intersect;
00249 }

G4bool G4QuadrangularFacet::IsDefined (  )  const [inline, virtual]

Implements G4VFacet.

Definition at line 174 of file G4QuadrangularFacet.hh.

References G4TriangularFacet::IsDefined().

00175 {
00176   return fFacet1.IsDefined();
00177 }

G4QuadrangularFacet & G4QuadrangularFacet::operator= ( const G4QuadrangularFacet right  ) 

Definition at line 157 of file G4QuadrangularFacet.cc.

References fFacet1, and fFacet2.

00158 {
00159   if (this == &rhs)
00160     return *this;
00161 
00162   fFacet1 = rhs.fFacet1;
00163   fFacet2 = rhs.fFacet2;
00164   fRadius = 0.0;
00165 
00166   return *this;
00167 }

void G4QuadrangularFacet::SetVertex ( G4int  i,
const G4ThreeVector val 
) [inline, virtual]

Implements G4VFacet.

Definition at line 147 of file G4QuadrangularFacet.hh.

References G4TriangularFacet::SetVertex().

Referenced by G4QuadrangularFacet().

00148 {
00149   switch (i)
00150   {
00151     case 0:
00152       fFacet1.SetVertex(0, val);
00153       fFacet2.SetVertex(0, val);
00154       break;
00155     case 1:
00156       fFacet1.SetVertex(1, val);
00157       break;
00158     case 2:
00159       fFacet1.SetVertex(2, val);
00160       fFacet2.SetVertex(1, val);
00161       break;
00162     case 3:
00163       fFacet2.SetVertex(2, val);
00164       break;
00165     }
00166 }

void G4QuadrangularFacet::SetVertices ( std::vector< G4ThreeVector > *  v  )  [inline, virtual]

Implements G4VFacet.

Definition at line 168 of file G4QuadrangularFacet.hh.

References G4TriangularFacet::SetVertices().

00169 {
00170   fFacet1.SetVertices(v);
00171   fFacet2.SetVertices(v);
00172 }


The documentation for this class was generated from the following files:
Generated on Mon May 27 17:53:15 2013 for Geant4 by  doxygen 1.4.7