0028599: Replacement of old Boolean operations with new ones in BRepProj_Projection...
[occt.git] / tests / lowalgos / extcs / circ_sph_parallel
1 puts "======================="
2 puts "Test for Circle/Sphere extrema algorithm"
3 puts "Parallel case (center of sphere is on the circle's axis)"
4 puts "======================="
5 puts ""
6
7 # Make sphere
8 set x0 0.
9 set y0 0.
10 set z0 0.
11 set sph_radius 10.
12 sphere s $x0 $y0 $z0 $sph_radius
13
14 # Initially the circle will be made at the same place as sphere with different radius
15 # and will be rotated and shifted many times.
16 # The distance between circle and sphere is a Abs(sqrt(centers_dist^2 + circ_radius^2) - sph_radius)
17
18 # Number of different radius of initial circle
19 set nb_radius 7
20 # Number of circle's rotations 
21 set nbstep 8
22 set angle [expr 180. / $nbstep]
23
24 # Define the shift
25 set shift_start -3
26 set shift_end 3
27 set shift 4
28
29 # Iteration step
30 set iStep 1
31
32 for {set i 1} {$i < $nb_radius} {incr i} {
33   set circ_radius [expr $i*2.]
34   circle c $x0 $y0 $z0 0 0 1 $circ_radius
35
36   # Circle will be rotated around the line
37   line rotation_line $x0 $y0 $z0 1 0 0
38   # Line rotation
39   for {set j 1} {$j <= $nbstep} {incr j} {
40     rotate rotation_line $x0 $y0 $z0 0 0 1 $angle
41     
42     # Get direction for circle's rotation
43     regexp {Axis   :([-0-9.+eE]*), ([-0-9.+eE]*), ([-0-9.+eE]*)} [dump rotation_line] full dx dy dz
44     
45     # Circle rotation
46     copy c c_rotated
47     for {set k 1} {$k <= $nbstep} {incr k} {
48       rotate c_rotated $x0 $y0 $z0 $dx $dy $dz $angle
49       
50       # Add shift of the circle along its own axis
51       
52       # Get shift direction
53       regexp {Axis   :([-0-9.+eE]*), ([-0-9.+eE]*), ([-0-9.+eE]*)} [dump c_rotated] full dcx dcy dcz
54       
55       set dcx [expr $shift*$dcx]
56       set dcy [expr $shift*$dcy]
57       set dcz [expr $shift*$dcz]
58       
59       # Make the shift
60       for {set t $shift_start} {$t <= $shift_end} {incr t} {
61         copy c_rotated c_shifted
62         translate c_shifted $t*$dcx $t*$dcy $t*$dcz 
63       
64         set log [extrema c_shifted s]
65
66         # save each circle if necessary
67         # copy c_shifted c_$iStep
68       
69         if {![regexp "Infinite number of extremas" $log]} {
70           puts "Error: Extrema has not detected the parallel case on step $iStep"
71         } else {
72           regexp {Center :([-0-9.+eE]*), ([-0-9.+eE]*), ([-0-9.+eE]*)} [dump c_shifted] full x y z
73           set centers_dist [expr sqrt($x*$x + $y*$y + $z*$z)]
74           set real_dist [expr abs(sqrt($centers_dist*$centers_dist + $circ_radius*$circ_radius) - $sph_radius)]
75           set ext_dist [lindex $log end]
76           checkreal "Step $iStep, min distance " $ext_dist $real_dist 1.e-7 1.e-7
77         }
78         incr iStep
79       }
80     }
81   }
82 }