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 ""
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
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)
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]
24 # Define the shift
25 set shift_start -3
26 set shift_end 3
27 set shift 4
29 # Iteration step
30 set iStep 1
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
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
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
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
50       # Add shift of the circle along its own axis
52       # Get shift direction
53       regexp {Axis   :([-0-9.+eE]*), ([-0-9.+eE]*), ([-0-9.+eE]*)} [dump c_rotated] full dcx dcy dcz
55       set dcx [expr \$shift*\$dcx]
56       set dcy [expr \$shift*\$dcy]
57       set dcz [expr \$shift*\$dcz]
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
64         set log [extrema c_shifted s]
66         # save each circle if necessary
67         # copy c_shifted c_\$iStep
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 }