source: trunk/source/geometry/solids/CSG/test/testG4Para1.cc @ 1342

Last change on this file since 1342 was 1316, checked in by garnier, 14 years ago

update geant4-09-04-beta-cand-01 interfaces-V09-03-09 vis-V09-03-08

File size: 24.6 KB
Line 
1//
2// ********************************************************************
3// * License and Disclaimer                                           *
4// *                                                                  *
5// * The  Geant4 software  is  copyright of the Copyright Holders  of *
6// * the Geant4 Collaboration.  It is provided  under  the terms  and *
7// * conditions of the Geant4 Software License,  included in the file *
8// * LICENSE and available at  http://cern.ch/geant4/license .  These *
9// * include a list of copyright holders.                             *
10// *                                                                  *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work  make  any representation or  warranty, express or implied, *
14// * regarding  this  software system or assume any liability for its *
15// * use.  Please see the license in the file  LICENSE  and URL above *
16// * for the full disclaimer and the limitation of liability.         *
17// *                                                                  *
18// * This  code  implementation is the result of  the  scientific and *
19// * technical work of the GEANT4 collaboration.                      *
20// * By using,  copying,  modifying or  distributing the software (or *
21// * any work based  on the software)  you  agree  to acknowledge its *
22// * use  in  resulting  scientific  publications,  and indicate your *
23// * acceptance of all terms of the Geant4 Software license.          *
24// ********************************************************************
25//
26//
27// $Id: testG4Para1.cc,v 1.8 2006/06/29 18:46:01 gunter Exp $
28// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
29//
30 
31// testG4Para
32//             Ensure asserts are compiled in
33
34#include <assert.h>
35#include <cmath>
36#include "G4ios.hh"
37
38#include "globals.hh"
39#include "geomdefs.hh"
40
41#include "ApproxEqual.hh"
42
43#include "G4ThreeVector.hh"
44#include "G4Para.hh"
45#include "G4RotationMatrix.hh"
46#include "G4AffineTransform.hh"
47#include "G4VoxelLimits.hh"
48
49G4bool testG4Para()
50{
51    G4ThreeVector pzero(0,0,0);
52    G4ThreeVector ponxside(20,0,0),ponyside(0,30,0),ponzside(0,0,40);
53    G4ThreeVector ponmxside(-20,0,0),ponmyside(0,-30,0),ponmzside(0,0,-40);
54    G4ThreeVector ponzsidey(0,25,40),ponmzsidey(0,25,-40);
55
56    G4ThreeVector pbigx(100,0,0),pbigy(0,100,0),pbigz(0,0,100), pbig(100,100,100);
57    G4ThreeVector pbigmx(-100,0,0),pbigmy(0,-100,0),pbigmz(0,0,-100);
58
59    G4ThreeVector vx(1,0,0),vy(0,1,0),vz(0,0,1);
60    G4ThreeVector vmx(-1,0,0),vmy(0,-1,0),vmz(0,0,-1);
61    G4ThreeVector vxy(1/std::sqrt(2.0),1/std::sqrt(2.0),0);
62    G4ThreeVector vmxy(-1/std::sqrt(2.0),1/std::sqrt(2.0),0);
63    G4ThreeVector vmxmy(-1/std::sqrt(2.0),-1/std::sqrt(2.0),0);
64    G4ThreeVector vxmy(1/std::sqrt(2.0),-1/std::sqrt(2.0),0);
65
66    G4double Dist, vol, volCheck;
67    G4ThreeVector *pNorm,norm;
68    G4bool *pgoodNorm,goodNorm,calcNorm=true;
69
70    pNorm=&norm;
71    pgoodNorm=&goodNorm;
72
73    G4ThreeVector trapvert[8] = { G4ThreeVector(-20.0,-30.0,-40.0),
74                                  G4ThreeVector(+20.0,-30.0,-40.0),
75                                  G4ThreeVector(-20.0,+30.0,-40.0),
76                                  G4ThreeVector(+20.0,+30.0,-40.0),
77                                  G4ThreeVector(-20.0,-30.0,+40.0),
78                                  G4ThreeVector(+20.0,-30.0,+40.0),
79                                  G4ThreeVector(-20.0,+30.0,+40.0),
80                                  G4ThreeVector(+20.0,+30.0,+40.0)   } ;
81   
82    //     G4Para trap1("Test Boxlike #1",20,30,40,0,0,0);
83   
84    //    G4Para trap2("Test Trdlike #2",40,0,0,20,10,10,0,40,30,30,0);
85   
86        G4Para trap1("Test Boxlike #1",trapvert);
87        G4Para trap2 = trap1 ;
88
89// Check name
90    assert(trap1.GetName()=="Test Boxlike #1");
91    //    assert(trap2.GetName()=="Test Trdlike #2");
92
93// check cubic volume
94
95    vol = trap1.GetCubicVolume();
96    volCheck = 8*20*30*40;
97    assert(ApproxEqual(vol,volCheck));
98
99
100// Check Inside
101    assert(trap1.Inside(pzero)==kInside);
102    assert(trap1.Inside(pbigz)==kOutside);
103    assert(trap1.Inside(ponxside)==kSurface);
104    assert(trap1.Inside(ponyside)==kSurface);
105    assert(trap1.Inside(ponzside)==kSurface);
106
107    assert(trap2.Inside(pzero)==kInside);
108    assert(trap2.Inside(pbigz)==kOutside);
109    assert(trap2.Inside(ponxside)==kSurface);
110    assert(trap2.Inside(ponyside)==kSurface);
111    assert(trap2.Inside(ponzside)==kSurface);
112
113// Check Surface Normal
114    G4ThreeVector normal;
115
116    normal=trap1.SurfaceNormal(ponxside);
117    assert(ApproxEqual(normal,G4ThreeVector(1,0,0)));
118    normal=trap1.SurfaceNormal(ponmxside);
119    assert(ApproxEqual(normal,G4ThreeVector(-1,0,0)));
120    normal=trap1.SurfaceNormal(ponyside);
121    assert(ApproxEqual(normal,G4ThreeVector(0,1,0)));
122    normal=trap1.SurfaceNormal(ponmyside);
123    assert(ApproxEqual(normal,G4ThreeVector(0,-1,0)));
124    normal=trap1.SurfaceNormal(ponzside);
125    assert(ApproxEqual(normal,G4ThreeVector(0,0,1)));
126    normal=trap1.SurfaceNormal(ponmzside);
127    assert(ApproxEqual(normal,G4ThreeVector(0,0,-1)));
128    normal=trap1.SurfaceNormal(ponzsidey);
129    assert(ApproxEqual(normal,G4ThreeVector(0,0,1)));
130    normal=trap1.SurfaceNormal(ponmzsidey);
131    assert(ApproxEqual(normal,G4ThreeVector(0,0,-1)));
132
133    // Normals on Edges
134
135    G4ThreeVector edgeXY(    20.0,  30., 0.0); 
136    G4ThreeVector edgemXmY( -20.0, -30., 0.0); 
137    G4ThreeVector edgeXmY(   20.0, -30., 0.0); 
138    G4ThreeVector edgemXY(  -20.0,  30., 0.0); 
139    G4ThreeVector edgeXZ(    20.0, 0.0, 40.0); 
140    G4ThreeVector edgemXmZ( -20.0, 0.0, -40.0); 
141    G4ThreeVector edgeXmZ(   20.0, 0.0, -40.0); 
142    G4ThreeVector edgemXZ(  -20.0, 0.0, 40.0); 
143    G4ThreeVector edgeYZ(    0.0,  30.0,  40.0); 
144    G4ThreeVector edgemYmZ(  0.0, -30.0, -40.0); 
145    G4ThreeVector edgeYmZ(   0.0,  30.0, -40.0); 
146    G4ThreeVector edgemYZ(   0.0, -30.0,  40.0); 
147
148    G4double invSqrt2 = 1.0 / std::sqrt( 2.0); 
149    G4double invSqrt3 = 1.0 / std::sqrt( 3.0); 
150
151    normal= trap1.SurfaceNormal( edgeXY ); 
152    assert(ApproxEqual( normal, G4ThreeVector( invSqrt2, invSqrt2, 0.0) )); 
153
154    // G4cout << " Normal at " << edgeXY << " is " << normal
155    //    << " Expected is " << G4ThreeVector( invSqrt2, invSqrt2, 0.0) << G4endl;     
156
157    normal= trap1.SurfaceNormal( edgemXmY ); 
158    assert(ApproxEqual( normal, G4ThreeVector( -invSqrt2, -invSqrt2, 0.0) )); 
159    normal= trap1.SurfaceNormal( edgeXmY ); 
160    assert(ApproxEqual( normal, G4ThreeVector( invSqrt2, -invSqrt2, 0.0) )); 
161    normal= trap1.SurfaceNormal( edgemXY ); 
162    assert(ApproxEqual( normal, G4ThreeVector( -invSqrt2, invSqrt2, 0.0) )); 
163
164    normal= trap1.SurfaceNormal( edgeXZ ); 
165    assert(ApproxEqual( normal, G4ThreeVector(  invSqrt2, 0.0, invSqrt2) )); 
166    normal= trap1.SurfaceNormal( edgemXmZ ); 
167    assert(ApproxEqual( normal, G4ThreeVector( -invSqrt2, 0.0, -invSqrt2) )); 
168    normal= trap1.SurfaceNormal( edgeXmZ ); 
169    assert(ApproxEqual( normal, G4ThreeVector(  invSqrt2, 0.0, -invSqrt2) )); 
170    normal= trap1.SurfaceNormal( edgemXZ ); 
171    assert(ApproxEqual( normal, G4ThreeVector( -invSqrt2, 0.0, invSqrt2) )); 
172
173    normal= trap1.SurfaceNormal( edgeYZ ); 
174    assert(ApproxEqual( normal, G4ThreeVector( 0.0,  invSqrt2,  invSqrt2) )); 
175    normal= trap1.SurfaceNormal( edgemYmZ ); 
176    assert(ApproxEqual( normal, G4ThreeVector( 0.0, -invSqrt2, -invSqrt2) )); 
177    normal= trap1.SurfaceNormal( edgeYmZ ); 
178    assert(ApproxEqual( normal, G4ThreeVector( 0.0,  invSqrt2, -invSqrt2) )); 
179    normal= trap1.SurfaceNormal( edgemYZ ); 
180    assert(ApproxEqual( normal, G4ThreeVector( 0.0, -invSqrt2,  invSqrt2) )); 
181
182    // Normals on corners
183
184    G4ThreeVector cornerXYZ(    20.0,  30., 40.0); 
185    G4ThreeVector cornermXYZ(  -20.0,  30., 40.0); 
186    G4ThreeVector cornerXmYZ(   20.0, -30., 40.0); 
187    G4ThreeVector cornermXmYZ( -20.0, -30., 40.0); 
188    G4ThreeVector cornerXYmZ(    20.0,  30., -40.0); 
189    G4ThreeVector cornermXYmZ(  -20.0,  30., -40.0); 
190    G4ThreeVector cornerXmYmZ(   20.0, -30., -40.0); 
191    G4ThreeVector cornermXmYmZ( -20.0, -30., -40.0); 
192 
193    normal= trap1.SurfaceNormal( cornerXYZ ); 
194    assert(ApproxEqual( normal, G4ThreeVector(  invSqrt3,  invSqrt3, invSqrt3) )); 
195    normal= trap1.SurfaceNormal( cornermXYZ ); 
196    assert(ApproxEqual( normal, G4ThreeVector( -invSqrt3,  invSqrt3, invSqrt3) )); 
197    normal= trap1.SurfaceNormal( cornerXmYZ ); 
198    assert(ApproxEqual( normal, G4ThreeVector(  invSqrt3, -invSqrt3, invSqrt3) )); 
199    normal= trap1.SurfaceNormal( cornermXmYZ ); 
200    assert(ApproxEqual( normal, G4ThreeVector( -invSqrt3, -invSqrt3, invSqrt3) )); 
201    normal= trap1.SurfaceNormal( cornerXYmZ ); 
202    assert(ApproxEqual( normal, G4ThreeVector(  invSqrt3,  invSqrt3, -invSqrt3) )); 
203    normal= trap1.SurfaceNormal( cornermXYmZ ); 
204    assert(ApproxEqual( normal, G4ThreeVector( -invSqrt3,  invSqrt3, -invSqrt3) )); 
205    normal= trap1.SurfaceNormal( cornerXmYmZ ); 
206    assert(ApproxEqual( normal, G4ThreeVector(  invSqrt3, -invSqrt3, -invSqrt3) )); 
207    normal= trap1.SurfaceNormal( cornermXmYmZ ); 
208    assert(ApproxEqual( normal, G4ThreeVector( -invSqrt3, -invSqrt3, -invSqrt3) )); 
209
210
211
212/*
213    G4double cosa = 4./std::sqrt(17.), sina = 1./std::sqrt(17.), tanga = 1.0/4.0 ;
214   
215    normal=trap2.SurfaceNormal(ponxside);
216    assert(ApproxEqual(normal,G4ThreeVector(cosa,0,-sina)));
217    normal=trap2.SurfaceNormal(ponmxside);
218    assert(ApproxEqual(normal,G4ThreeVector(-cosa,0,-sina)));
219    normal=trap2.SurfaceNormal(ponyside);
220    assert(ApproxEqual(normal,G4ThreeVector(0,cosa,-sina)));
221    normal=trap2.SurfaceNormal(ponmyside);
222    assert(ApproxEqual(normal,G4ThreeVector(0,-cosa,-sina)));
223    normal=trap2.SurfaceNormal(ponzside);
224    assert(ApproxEqual(normal,G4ThreeVector(0,0,1)));
225    normal=trap2.SurfaceNormal(ponmzside);
226    assert(ApproxEqual(normal,G4ThreeVector(0,0,-1)));
227    normal=trap2.SurfaceNormal(ponzsidey);
228    assert(ApproxEqual(normal,G4ThreeVector(0,0,1)));
229    normal=trap2.SurfaceNormal(ponmzsidey);
230    assert(ApproxEqual(normal,G4ThreeVector(0,0,-1))); // (0,cosa,-sina) ?
231*/
232// DistanceToOut(P)
233
234    Dist=trap1.DistanceToOut(pzero);
235    assert(ApproxEqual(Dist,20));
236    Dist=trap1.DistanceToOut(vx);
237    assert(ApproxEqual(Dist,19));
238    Dist=trap1.DistanceToOut(vy);
239    assert(ApproxEqual(Dist,20));
240    Dist=trap1.DistanceToOut(vz);
241    assert(ApproxEqual(Dist,20));
242
243/*    Dist=trap2.DistanceToOut(pzero);
244    assert(ApproxEqual(Dist,20*cosa));
245    Dist=trap2.DistanceToOut(vx);
246    assert(ApproxEqual(Dist,19*cosa));
247    Dist=trap2.DistanceToOut(vy);
248    assert(ApproxEqual(Dist,20*cosa));
249    Dist=trap2.DistanceToOut(vz);
250    assert(ApproxEqual(Dist,20*cosa+sina));
251*/
252
253// DistanceToOut(P,V)
254
255    Dist=trap1.DistanceToOut(pzero,vx,calcNorm,pgoodNorm,pNorm);
256    assert(ApproxEqual(Dist,20)&&ApproxEqual(*pNorm,vx)&&*pgoodNorm);
257    Dist=trap1.DistanceToOut(pzero,vmx,calcNorm,pgoodNorm,pNorm);
258    assert(ApproxEqual(Dist,20)&&ApproxEqual(norm,vmx)&&*pgoodNorm);
259    Dist=trap1.DistanceToOut(pzero,vy,calcNorm,pgoodNorm,pNorm);
260    assert(ApproxEqual(Dist,30)&&ApproxEqual(norm,vy)&&*pgoodNorm);
261    Dist=trap1.DistanceToOut(pzero,vmy,calcNorm,pgoodNorm,pNorm);
262    assert(ApproxEqual(Dist,30)&&ApproxEqual(norm,vmy)&&*pgoodNorm);
263    Dist=trap1.DistanceToOut(pzero,vz,calcNorm,pgoodNorm,pNorm);
264    assert(ApproxEqual(Dist,40)&&ApproxEqual(norm,vz)&&*pgoodNorm);
265    Dist=trap1.DistanceToOut(pzero,vmz,calcNorm,pgoodNorm,pNorm);
266    assert(ApproxEqual(Dist,40)&&ApproxEqual(norm,vmz)&&*pgoodNorm);
267    Dist=trap1.DistanceToOut(pzero,vxy,calcNorm,pgoodNorm,pNorm);
268    assert(ApproxEqual(Dist,std::sqrt(800.))&&*pgoodNorm);
269
270    Dist=trap1.DistanceToOut(ponxside,vx,calcNorm,pgoodNorm,pNorm);
271    assert(ApproxEqual(Dist,0)&&ApproxEqual(*pNorm,vx)&&*pgoodNorm);
272    Dist=trap1.DistanceToOut(ponmxside,vmx,calcNorm,pgoodNorm,pNorm);
273    assert(ApproxEqual(Dist,0)&&ApproxEqual(norm,vmx)&&*pgoodNorm);
274    Dist=trap1.DistanceToOut(ponyside,vy,calcNorm,pgoodNorm,pNorm);
275    assert(ApproxEqual(Dist,0)&&ApproxEqual(norm,vy)&&*pgoodNorm);
276    Dist=trap1.DistanceToOut(ponmyside,vmy,calcNorm,pgoodNorm,pNorm);
277    assert(ApproxEqual(Dist,0)&&ApproxEqual(norm,vmy)&&*pgoodNorm);
278    Dist=trap1.DistanceToOut(ponzside,vz,calcNorm,pgoodNorm,pNorm);
279    assert(ApproxEqual(Dist,0)&&ApproxEqual(norm,vz)&&*pgoodNorm);
280    Dist=trap1.DistanceToOut(ponmzside,vmz,calcNorm,pgoodNorm,pNorm);
281    assert(ApproxEqual(Dist,0)&&ApproxEqual(norm,vmz)&&*pgoodNorm);
282
283/*    Dist=trap2.DistanceToOut(pzero,vx,calcNorm,pgoodNorm,pNorm);
284    assert(ApproxEqual(Dist,20)&&ApproxEqual(*pNorm,G4ThreeVector(cosa,0,-sina))&&*pgoodNorm);
285    Dist=trap2.DistanceToOut(pzero,vmx,calcNorm,pgoodNorm,pNorm);
286    assert(ApproxEqual(Dist,20)&&ApproxEqual(norm,G4ThreeVector(-cosa,0,-sina))&&*pgoodNorm);
287    Dist=trap2.DistanceToOut(pzero,vy,calcNorm,pgoodNorm,pNorm);
288    assert(ApproxEqual(Dist,30)&&ApproxEqual(norm,G4ThreeVector(0,cosa,-sina))&&*pgoodNorm);
289    Dist=trap2.DistanceToOut(pzero,vmy,calcNorm,pgoodNorm,pNorm);
290    assert(ApproxEqual(Dist,30)&&ApproxEqual(norm,G4ThreeVector(0,-cosa,-sina))&&*pgoodNorm);
291    Dist=trap2.DistanceToOut(pzero,vz,calcNorm,pgoodNorm,pNorm);
292    assert(ApproxEqual(Dist,40)&&ApproxEqual(norm,vz)&&*pgoodNorm);
293    Dist=trap2.DistanceToOut(pzero,vmz,calcNorm,pgoodNorm,pNorm);
294    assert(ApproxEqual(Dist,40)&&ApproxEqual(norm,vmz)&&*pgoodNorm);
295    Dist=trap2.DistanceToOut(pzero,vxy,calcNorm,pgoodNorm,pNorm);
296    assert(ApproxEqual(Dist,std::sqrt(800))&&*pgoodNorm);
297
298    Dist=trap2.DistanceToOut(ponxside,vx,calcNorm,pgoodNorm,pNorm);
299    assert(ApproxEqual(Dist,0)&&ApproxEqual(*pNorm,G4ThreeVector(cosa,0,-sina))&&*pgoodNorm);
300    Dist=trap2.DistanceToOut(ponmxside,vmx,calcNorm,pgoodNorm,pNorm);
301    assert(ApproxEqual(Dist,0)&&ApproxEqual(norm,G4ThreeVector(-cosa,0,-sina))&&*pgoodNorm);
302    Dist=trap2.DistanceToOut(ponyside,vy,calcNorm,pgoodNorm,pNorm);
303    assert(ApproxEqual(Dist,0)&&ApproxEqual(norm,G4ThreeVector(0,cosa,-sina))&&*pgoodNorm);
304    Dist=trap2.DistanceToOut(ponmyside,vmy,calcNorm,pgoodNorm,pNorm);
305    assert(ApproxEqual(Dist,0)&&ApproxEqual(norm,G4ThreeVector(0,-cosa,-sina))&&*pgoodNorm);
306    Dist=trap2.DistanceToOut(ponzside,vz,calcNorm,pgoodNorm,pNorm);
307    assert(ApproxEqual(Dist,0)&&ApproxEqual(norm,vz)&&*pgoodNorm);
308    Dist=trap2.DistanceToOut(ponmzside,vmz,calcNorm,pgoodNorm,pNorm);
309    assert(ApproxEqual(Dist,0)&&ApproxEqual(norm,vmz)&&*pgoodNorm);
310*/
311
312//DistanceToIn(P)
313   
314    Dist=trap1.DistanceToIn(pbig);
315    G4cout<<"trap1.DistanceToIn(pbig) = "<<Dist<<G4endl;
316    assert(ApproxEqual(Dist,80));
317    Dist=trap1.DistanceToIn(pbigx);
318    assert(ApproxEqual(Dist,80));
319    Dist=trap1.DistanceToIn(pbigmx);
320    assert(ApproxEqual(Dist,80));
321    Dist=trap1.DistanceToIn(pbigy);
322    assert(ApproxEqual(Dist,70));
323    Dist=trap1.DistanceToIn(pbigmy);
324    assert(ApproxEqual(Dist,70));
325    Dist=trap1.DistanceToIn(pbigz);
326    assert(ApproxEqual(Dist,60));
327    Dist=trap1.DistanceToIn(pbigmz);
328    assert(ApproxEqual(Dist,60));
329
330/*    Dist=trap2.DistanceToIn(pbigx);
331    assert(ApproxEqual(Dist,80*cosa));
332    Dist=trap2.DistanceToIn(pbigmx);
333    assert(ApproxEqual(Dist,80*cosa));
334    Dist=trap2.DistanceToIn(pbigy);
335    assert(ApproxEqual(Dist,70*cosa));
336    Dist=trap2.DistanceToIn(pbigmy);
337    assert(ApproxEqual(Dist,70*cosa));
338    Dist=trap2.DistanceToIn(pbigz);
339    assert(ApproxEqual(Dist,60));
340    Dist=trap2.DistanceToIn(pbigmz);
341    assert(ApproxEqual(Dist,60));
342*/
343
344// DistanceToIn(P,V)
345
346    Dist=trap1.DistanceToIn(pbigx,vmx);
347    assert(ApproxEqual(Dist,80));
348    Dist=trap1.DistanceToIn(pbigmx,vx);
349    assert(ApproxEqual(Dist,80));
350    Dist=trap1.DistanceToIn(pbigy,vmy);
351    assert(ApproxEqual(Dist,70));
352    Dist=trap1.DistanceToIn(pbigmy,vy);
353    assert(ApproxEqual(Dist,70));
354    Dist=trap1.DistanceToIn(pbigz,vmz);
355    assert(ApproxEqual(Dist,60));
356    Dist=trap1.DistanceToIn(pbigmz,vz);
357    assert(ApproxEqual(Dist,60));
358    Dist=trap1.DistanceToIn(pbigx,vxy);
359    assert(ApproxEqual(Dist,kInfinity));
360    Dist=trap1.DistanceToIn(pbigmx,vxy);
361    assert(ApproxEqual(Dist,kInfinity));
362
363/*    Dist=trap2.DistanceToIn(pbigx,vmx);
364    assert(ApproxEqual(Dist,80));
365    Dist=trap2.DistanceToIn(pbigmx,vx);
366    assert(ApproxEqual(Dist,80));
367    Dist=trap2.DistanceToIn(pbigy,vmy);
368    assert(ApproxEqual(Dist,70));
369    Dist=trap2.DistanceToIn(pbigmy,vy);
370    assert(ApproxEqual(Dist,70));
371    Dist=trap2.DistanceToIn(pbigz,vmz);
372    assert(ApproxEqual(Dist,60));
373    Dist=trap2.DistanceToIn(pbigmz,vz);
374    assert(ApproxEqual(Dist,60));
375    Dist=trap2.DistanceToIn(pbigx,vxy);
376    assert(ApproxEqual(Dist,kInfinity));
377    Dist=trap2.DistanceToIn(pbigmx,vxy);
378    assert(ApproxEqual(Dist,kInfinity));
379*/
380
381// CalculateExtent
382
383    G4VoxelLimits limit;                // Unlimited
384    G4AffineTransform origin(pzero);
385    G4double min,max;
386
387    assert(trap1.CalculateExtent(kXAxis,limit,origin,min,max));
388    assert(ApproxEqual(min,-20)&&ApproxEqual(max,20));
389    assert(trap1.CalculateExtent(kYAxis,limit,origin,min,max));
390    assert(ApproxEqual(min,-30)&&ApproxEqual(max,30));
391    assert(trap1.CalculateExtent(kZAxis,limit,origin,min,max));
392    assert(ApproxEqual(min,-40)&&ApproxEqual(max,40));
393
394/*    assert(trap2.CalculateExtent(kXAxis,limit,origin,min,max));
395    assert(ApproxEqual(min,-30)&&ApproxEqual(max,30));
396    assert(trap2.CalculateExtent(kYAxis,limit,origin,min,max));
397    assert(ApproxEqual(min,-40)&&ApproxEqual(max,40));
398    assert(trap2.CalculateExtent(kZAxis,limit,origin,min,max));
399    assert(ApproxEqual(min,-40)&&ApproxEqual(max,40));
400*/
401
402    G4ThreeVector pmxmymz(-100,-110,-120);
403    G4AffineTransform tPosOnly(pmxmymz);
404
405    assert(trap1.CalculateExtent(kXAxis,limit,tPosOnly,min,max));
406    assert(ApproxEqual(min,-120)&&ApproxEqual(max,-80));   
407    assert(trap1.CalculateExtent(kYAxis,limit,tPosOnly,min,max));
408    assert(ApproxEqual(min,-140)&&ApproxEqual(max,-80));
409    assert(trap1.CalculateExtent(kZAxis,limit,tPosOnly,min,max));
410    assert(ApproxEqual(min,-160)&&ApproxEqual(max,-80));
411
412/*    assert(trap2.CalculateExtent(kXAxis,limit,tPosOnly,min,max));
413    assert(ApproxEqual(min,-130)&&ApproxEqual(max,-70));   
414    assert(trap2.CalculateExtent(kYAxis,limit,tPosOnly,min,max));
415    assert(ApproxEqual(min,-150)&&ApproxEqual(max,-70));
416    assert(trap2.CalculateExtent(kZAxis,limit,tPosOnly,min,max));
417    assert(ApproxEqual(min,-160)&&ApproxEqual(max,-80));
418*/
419
420    G4RotationMatrix r90Z;
421    r90Z.rotateZ(halfpi);
422    G4AffineTransform tRotZ(r90Z,pzero);
423
424    assert(trap1.CalculateExtent(kXAxis,limit,tRotZ,min,max));
425    assert(ApproxEqual(min,-30)&&ApproxEqual(max,30));
426    assert(trap1.CalculateExtent(kYAxis,limit,tRotZ,min,max));
427    assert(ApproxEqual(min,-20)&&ApproxEqual(max,20));
428    assert(trap1.CalculateExtent(kZAxis,limit,tRotZ,min,max));
429    assert(ApproxEqual(min,-40)&&ApproxEqual(max,40));
430
431/*    assert(trap2.CalculateExtent(kXAxis,limit,tRotZ,min,max));
432    assert(ApproxEqual(min,-40)&&ApproxEqual(max,40));
433    assert(trap2.CalculateExtent(kYAxis,limit,tRotZ,min,max));
434    assert(ApproxEqual(min,-30)&&ApproxEqual(max,30));
435    assert(trap2.CalculateExtent(kZAxis,limit,tRotZ,min,max));
436    assert(ApproxEqual(min,-40)&&ApproxEqual(max,40));
437*/
438
439// Check that clipped away
440
441    G4VoxelLimits xClip;
442    xClip.AddLimit(kXAxis,-100,-50);
443
444    assert(!trap1.CalculateExtent(kXAxis,xClip,origin,min,max));
445
446    assert(!trap2.CalculateExtent(kXAxis,xClip,origin,min,max));
447
448
449// Assert clipped to volume
450
451    G4VoxelLimits allClip;
452    allClip.AddLimit(kXAxis,-5,+5);
453    allClip.AddLimit(kYAxis,-5,+5);
454    allClip.AddLimit(kZAxis,-5,+5);
455   
456    G4RotationMatrix genRot;
457    genRot.rotateX(pi/6);
458    genRot.rotateY(pi/6);
459    genRot.rotateZ(pi/6);
460   
461    G4AffineTransform tGen(genRot,vx);
462
463    assert(trap1.CalculateExtent(kXAxis,allClip,tGen,min,max));
464    assert(ApproxEqual(min,-5)&&ApproxEqual(max,5));
465    assert(trap1.CalculateExtent(kYAxis,allClip,tGen,min,max));
466    assert(ApproxEqual(min,-5)&&ApproxEqual(max,5));
467    assert(trap1.CalculateExtent(kZAxis,allClip,tGen,min,max));
468    assert(ApproxEqual(min,-5)&&ApproxEqual(max,5));
469
470    assert(trap2.CalculateExtent(kXAxis,allClip,tGen,min,max));
471    assert(ApproxEqual(min,-5)&&ApproxEqual(max,5));
472    assert(trap2.CalculateExtent(kYAxis,allClip,tGen,min,max));
473    assert(ApproxEqual(min,-5)&&ApproxEqual(max,5));
474    assert(trap2.CalculateExtent(kZAxis,allClip,tGen,min,max));
475    assert(ApproxEqual(min,-5)&&ApproxEqual(max,5));
476
477
478    G4VoxelLimits buggyClip2;
479    buggyClip2.AddLimit(kXAxis,5,15);
480
481    assert(trap1.CalculateExtent(kXAxis,buggyClip2,origin,min,max));
482    assert(ApproxEqual(min,5)&&ApproxEqual(max,15));
483    assert(trap1.CalculateExtent(kYAxis,buggyClip2,origin,min,max));
484    assert(ApproxEqual(min,-30)&&ApproxEqual(max,30));
485    assert(trap1.CalculateExtent(kZAxis,buggyClip2,origin,min,max));
486    assert(ApproxEqual(min,-40)&&ApproxEqual(max,40));
487
488    assert(trap2.CalculateExtent(kXAxis,buggyClip2,origin,min,max));
489    assert(ApproxEqual(min,5)&&ApproxEqual(max,15));
490/*    assert(trap2.CalculateExtent(kYAxis,buggyClip2,origin,min,max));
491    assert(ApproxEqual(min,-40)&&ApproxEqual(max,40));
492    assert(trap2.CalculateExtent(kZAxis,buggyClip2,origin,min,max));
493    assert(ApproxEqual(min,-40)&&ApproxEqual(max,40));
494*/
495
496    buggyClip2.AddLimit(kYAxis,5,15);
497
498    assert(trap1.CalculateExtent(kXAxis,buggyClip2,origin,min,max));
499    assert(ApproxEqual(min,5)&&ApproxEqual(max,15));
500    assert(trap1.CalculateExtent(kYAxis,buggyClip2,origin,min,max));
501    assert(ApproxEqual(min,5)&&ApproxEqual(max,15));
502    assert(trap1.CalculateExtent(kZAxis,buggyClip2,origin,min,max));
503    assert(ApproxEqual(min,-40)&&ApproxEqual(max,40));
504
505    assert(trap2.CalculateExtent(kXAxis,buggyClip2,origin,min,max));
506    assert(ApproxEqual(min,5)&&ApproxEqual(max,15));
507    assert(trap2.CalculateExtent(kYAxis,buggyClip2,origin,min,max));
508    assert(ApproxEqual(min,5)&&ApproxEqual(max,15));
509    assert(trap2.CalculateExtent(kZAxis,buggyClip2,origin,min,max));
510    assert(ApproxEqual(min,-40)&&ApproxEqual(max,40));
511
512
513    G4VoxelLimits buggyClip1;
514    buggyClip1.AddLimit(kXAxis,-5,+5);
515
516    assert(trap1.CalculateExtent(kXAxis,buggyClip1,origin,min,max));
517    assert(ApproxEqual(min,-5)&&ApproxEqual(max,5));
518    assert(trap1.CalculateExtent(kYAxis,buggyClip1,origin,min,max));
519    assert(ApproxEqual(min,-30)&&ApproxEqual(max,30));
520    assert(trap1.CalculateExtent(kZAxis,buggyClip1,origin,min,max));
521    assert(ApproxEqual(min,-40)&&ApproxEqual(max,40));
522
523    assert(trap2.CalculateExtent(kXAxis,buggyClip1,origin,min,max));
524    assert(ApproxEqual(min,-5)&&ApproxEqual(max,5));
525/*    assert(trap2.CalculateExtent(kYAxis,buggyClip1,origin,min,max));
526    assert(ApproxEqual(min,-40)&&ApproxEqual(max,40));
527    assert(trap2.CalculateExtent(kZAxis,buggyClip1,origin,min,max));
528    assert(ApproxEqual(min,-40)&&ApproxEqual(max,40));
529*/
530
531    buggyClip1.AddLimit(kYAxis,-5,+5);
532
533    assert(trap1.CalculateExtent(kXAxis,buggyClip1,origin,min,max));
534    assert(ApproxEqual(min,-5)&&ApproxEqual(max,5));
535    assert(trap1.CalculateExtent(kYAxis,buggyClip1,origin,min,max));
536    assert(ApproxEqual(min,-5)&&ApproxEqual(max,5));
537    assert(trap1.CalculateExtent(kZAxis,buggyClip1,origin,min,max));
538    assert(ApproxEqual(min,-40)&&ApproxEqual(max,40));
539
540    assert(trap2.CalculateExtent(kXAxis,buggyClip1,origin,min,max));
541    assert(ApproxEqual(min,-5)&&ApproxEqual(max,5));
542    assert(trap2.CalculateExtent(kYAxis,buggyClip1,origin,min,max));
543    assert(ApproxEqual(min,-5)&&ApproxEqual(max,5));
544    assert(trap2.CalculateExtent(kZAxis,buggyClip1,origin,min,max));
545    assert(ApproxEqual(min,-40)&&ApproxEqual(max,40));
546
547   
548    G4VoxelLimits newvoxlim;
549    newvoxlim.AddLimit(kZAxis,-5,+5);
550   
551    assert(trap1.CalculateExtent(kXAxis,newvoxlim,origin,min,max));
552    assert(ApproxEqual(min,-20)&&ApproxEqual(max,20));
553    assert(trap1.CalculateExtent(kYAxis,newvoxlim,origin,min,max));
554    assert(ApproxEqual(min,-30)&&ApproxEqual(max,30));
555    assert(trap1.CalculateExtent(kZAxis,newvoxlim,origin,min,max));
556    assert(ApproxEqual(min,-5)&&ApproxEqual(max,5));
557
558/*    assert(trap2.CalculateExtent(kXAxis,newvoxlim,origin,min,max));
559    assert(ApproxEqual(min,-(20+5*tanga))&&ApproxEqual(max,20+5*tanga));
560    assert(trap2.CalculateExtent(kYAxis,newvoxlim,origin,min,max));
561    assert(ApproxEqual(min,-(30+5*tanga))&&ApproxEqual(max,30+5*tanga));
562    assert(trap2.CalculateExtent(kZAxis,newvoxlim,origin,min,max));
563    assert(ApproxEqual(min,-5)&&ApproxEqual(max,5));
564*/
565    G4VoxelLimits nonsymvox;
566    nonsymvox.AddLimit(kZAxis,5,15);
567   
568/*    assert(trap2.CalculateExtent(kXAxis,nonsymvox,origin,min,max));
569    assert(ApproxEqual(min,-(20+15*tanga))&&ApproxEqual(max,20+15*tanga));
570    assert(trap2.CalculateExtent(kYAxis,nonsymvox,origin,min,max));
571    assert(ApproxEqual(min,-(30+15*tanga))&&ApproxEqual(max,30+15*tanga));
572    assert(trap2.CalculateExtent(kZAxis,nonsymvox,origin,min,max));
573    assert(ApproxEqual(min,5)&&ApproxEqual(max,15));
574*/
575    return true;
576}
577
578int main()
579{
580#ifdef NDEBUG
581    G4Exception("FAIL: *** Assertions must be compiled in! ***");
582#endif
583    assert(testG4Para());
584    return 0;
585}
586
587
588
589
590
Note: See TracBrowser for help on using the repository browser.