#include <G4QuadrangularFacet.hh>
Inheritance diagram for G4QuadrangularFacet:
Definition at line 69 of file G4QuadrangularFacet.hh.
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 | ( | ) |
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] |
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().
G4ThreeVector G4QuadrangularFacet::GetCircumcentre | ( | ) | const [inline, virtual] |
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] |
G4int G4QuadrangularFacet::GetNumberOfVertices | ( | ) | const [inline, virtual] |
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] |
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().
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 }