puts "=======================" puts "Test for Circle/Sphere extrema algorithm" puts "Touch case (circle is just touching the sphere)" puts "=======================" puts "" # Make sphere set x0 0. set y0 0. set z0 0. set sph_radius 10. sphere s $x0 $y0 $z0 $sph_radius # Initially the circle will be made at the same place as sphere with different radius # and will shifted many times to touch the sphere. # The distance should always be close to zero. # Number of different radius of initial circle set nb_radius 7 # Number of circle's rotations set nbstep 8 set angle [expr 180. / $nbstep] # Iteration step set iStep 1 for {set i 1} {$i < $nb_radius} {incr i} { set circ_radius [expr $i*2.] if {$circ_radius == $sph_radius} { set circ_radius [expr $circ_radius + 0.1] } circle c $x0 $y0 $z0 0 0 1 $circ_radius # Circle will be rotated around the line line rotation_line $x0 $y0 $z0 1 0 0 # Line rotation for {set j 1} {$j <= $nbstep} {incr j} { rotate rotation_line $x0 $y0 $z0 0 0 1 $angle # Get direction for circle's rotation regexp {Axis :([-0-9.+eE]*), ([-0-9.+eE]*), ([-0-9.+eE]*)} [dump rotation_line] full dx dy dz # Circle rotation copy c c_rotated for {set k 1} {$k <= $nbstep} {incr k} { rotate c_rotated $x0 $y0 $z0 $dx $dy $dz $angle # Get translation axis for the circle regexp {XAxis :([-0-9.+eE]*), ([-0-9.+eE]*), ([-0-9.+eE]*)} [dump c_rotated] full dxx dxy dxz # Get rotation plane for translation line regexp {YAxis :([-0-9.+eE]*), ([-0-9.+eE]*), ([-0-9.+eE]*)} [dump c_rotated] full dyx dyy dyz line translation_line $x0 $y0 $z0 $dxx $dxy $dxz for {set n 1} {$n <= $nbstep} {incr n} { rotate translation_line $x0 $y0 $z0 $dyx $dyy $dyz $angle # Get direction for circle's translation regexp {Axis :([-0-9.+eE]*), ([-0-9.+eE]*), ([-0-9.+eE]*)} [dump translation_line] full dtx dty dtz # Circle's translation copy c_rotated c_shifted translate c_shifted $sph_radius*$dtx $sph_radius*$dty $sph_radius*$dtz # Shift circle to touch sphere set shift -1 repeat 2 { copy c_shifted c_touch translate c_touch $shift*$circ_radius*$dxx $shift*$circ_radius*$dxy $shift*$circ_radius*$dxz set log [extrema c_touch s] # save each circle if necessary # copy c_touch c_$iStep if {![regexp "ext_1" $log]} { if {![regexp "Extrema 1 is point" $log]} { puts "Error: Extrema has not detected the touching case on step $iStep" } else { puts "Check of Step $iStep, min distance OK" } } else { set ext_dist [lindex [length ext_1] end] checkreal "Step $iStep, min distance " $ext_dist 0 1.e-7 1.e-7 } incr iStep set shift 1 } } } } }