mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-04-02 17:46:22 +03:00
The usage of *BRepAlgo_Section* has been replaced with the usage of *BRepAlgoAPI_Section* in *BRepProj_Projection* algorithm. The TODO statements have been removed from the failing test case in the "prj" grid as they are working correctly now. The following changes have been made to improve the performance *BRepAlgoAPI_Section*: 1. Revision of the *IntPolyh_Intersection* class to avoid repeated calculation of the deflection of the same triangulation. 2. Small revision of the Edge/Face intersection algorithm to perform Extrema computation on the whole intersection range of the edge instead of discrete ranges. 3. Implementation of the extrema computation for the Circle and Sphere. 4. Correct computation of the parameter of the point on the Circle.
83 lines
2.5 KiB
Plaintext
83 lines
2.5 KiB
Plaintext
puts "======================="
|
|
puts "Test for Circle/Sphere extrema algorithm"
|
|
puts "Parallel case (center of sphere is on the circle's axis)"
|
|
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 be rotated and shifted many times.
|
|
# The distance between circle and sphere is a Abs(sqrt(centers_dist^2 + circ_radius^2) - sph_radius)
|
|
|
|
# Number of different radius of initial circle
|
|
set nb_radius 7
|
|
# Number of circle's rotations
|
|
set nbstep 8
|
|
set angle [expr 180. / $nbstep]
|
|
|
|
# Define the shift
|
|
set shift_start -3
|
|
set shift_end 3
|
|
set shift 4
|
|
|
|
# Iteration step
|
|
set iStep 1
|
|
|
|
for {set i 1} {$i < $nb_radius} {incr i} {
|
|
set circ_radius [expr $i*2.]
|
|
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
|
|
|
|
# Add shift of the circle along its own axis
|
|
|
|
# Get shift direction
|
|
regexp {Axis :([-0-9.+eE]*), ([-0-9.+eE]*), ([-0-9.+eE]*)} [dump c_rotated] full dcx dcy dcz
|
|
|
|
set dcx [expr $shift*$dcx]
|
|
set dcy [expr $shift*$dcy]
|
|
set dcz [expr $shift*$dcz]
|
|
|
|
# Make the shift
|
|
for {set t $shift_start} {$t <= $shift_end} {incr t} {
|
|
copy c_rotated c_shifted
|
|
translate c_shifted $t*$dcx $t*$dcy $t*$dcz
|
|
|
|
set log [extrema c_shifted s]
|
|
|
|
# save each circle if necessary
|
|
# copy c_shifted c_$iStep
|
|
|
|
if {![regexp "Infinite number of extremas" $log]} {
|
|
puts "Error: Extrema has not detected the parallel case on step $iStep"
|
|
} else {
|
|
regexp {Center :([-0-9.+eE]*), ([-0-9.+eE]*), ([-0-9.+eE]*)} [dump c_shifted] full x y z
|
|
set centers_dist [expr sqrt($x*$x + $y*$y + $z*$z)]
|
|
set real_dist [expr abs(sqrt($centers_dist*$centers_dist + $circ_radius*$circ_radius) - $sph_radius)]
|
|
set ext_dist [lindex $log end]
|
|
checkreal "Step $iStep, min distance " $ext_dist $real_dist 1.e-7 1.e-7
|
|
}
|
|
incr iStep
|
|
}
|
|
}
|
|
}
|
|
}
|