! The Boolean engine of HP PE/SolidDesigner applies standard and nonstandard Boolean set operations to solid models to perform an impressive variety of machining operations. Parallel calculation boosts performance, especially with multiprocessor hardware. " %&+&+$ ,-"/1&,+0 )&(" -2+ % ,/" +! ,1%"/0 -)6 + &*-,/1+1 /,)" &+ 1%" #2+ 1&,+ 0"1 ,# ,+1"*-,//6 0608 1"*0 + ,)&!"0&$+"/ 1%" &*-/"00&3" 3/&"16 ,# *8 %&+&+$ ,**+!0 /" !/&3"+ 6 0&+$)" 1,-,),$6 "+$&+" ,#1"+ /"#"//"! 1, 0 1 *&$%1 0""* 1%1 1%" )$,/&1%* 20"! 6 1%" ,,)"+ "+$&+" 4,2)! " "51/"*")6 ,*-)"5 +! "0,1"/& +! 1%&0 &0 &+!""! 1/2" &+ 0,*" /"0-" 10 %" 2+!"/)6&+$ -/&+ &-)"0 %,4"3"/ /" 0&*-)" ,01 ,# 1%&0 /1& )" !"*,+01/1"0 1%&0 6 1(&+$ #&/)6 &+12&1&3" ),,( 1 1%" &+1"/+) * %&+"/6 %&0 4&)) -/,8 3&!" /,! *- #,/ 1%" 0" ,+! *,/" 1" %+& ) -/1 ,# 1%" /1& )" &+ 4%& % 0,*" ("6 )$,/&1%*0 /" "5-)&+"! &+ $/"1"/ !"-1% &+))6 0,*" 2+202) --)& 1&,+0 ,# 1%" ,,)"+ "+$&+" /" /&"#)6 *"+1&,+"! "#,/" "5-),/&+$ 1%" &+1"/+)0 ,# 1%" ,,)"+ "+$&+" )"10 1(" ),,( 1 1%" ,'" 10 1%1 &1 4,/(0 ,+ %"0" ,'" 10 /" ))"! 0,)&!0 ,/ 0&*-)6 ,!&"0 ,)&!0 &+ ,2/ 1"/*0 /" *1%"*1& ) ,2+!/6 /"-/"0"+11&,+ 8"- *,!")0 ,# $",*"1/& ,'" 10 &$ 0%,40 8"- *,!") ,# 6)&+!"/ 02))6 0"3"/) 1"$,/&"0 ,# 0,)&!0 /" !&01&+$2&0%"! 0"! ,+ 1%"&/ *+&#,)! %/ 1"/&01& 0 ,/ ,2/ -2/-,0"0 4" '201 +""! 1, (+,4 1%1 0,)&!0 /"-/"0"+1 /") ,'" 10 +! Body Shell Face-1 Face-3 Face-2 Loop-1 Loop-3a Loop-3b Loop-2 Coedge-1 Coedge-2a Coedge-2b Coedge-2 Edge-1 Edge-2 Vertex-1 Vertex-2 ,2+!/6 /"-/"0"+11&,+ 8"- *,!") ,# 6)&+!"/ 1,"/ "4)"118 (/! ,2/+) 0 /"4!/&3"/ /"-/"0"+1&+$ 1%" )00 ,# *+2# 12/)" ,!&"0 0,)&!0 /" &*-,00&)" &+ 0,*" 46 +&#,)! ,!&"0 /" ,# $"+"/) &+1"/"01 0&+ " 1%"6 + " *+2# 8 12/"! &$ 0%,40 0 /"4!/&3"/ /"-/"0"+1&+$ 1%" )00 ,# *+2# 12/)" ,!&"0 %" )00 ,# +,+*+&#,)! ,!&"0 &0 1%" /")* ,# 1%" &*-,00&8 )" ,!&"0 %"0" ,!&"0 ++,1 " *+2# 12/"! " 20" 1%" *1"/&) 1%& (+"00 $,"0 1, 7"/, 1%1 1%" 1%& (+"00 $,"0 1, 7"/, &0 ,+0".2"+ " +,1 20" ,# 1%" +,+*+&#,)!8 +"00 "3"/1%")"00 1%"6 %3" %3" 0,*" &*-,/1+ " 0 ,+ "-12) 01/ 1&,+0 ,/ 0&*-)&#& 1&,+0 ,# /") *+&#,)! 0,)&!0 ,+*+&#,)! 0,)&!0 0,*"1&*"0 /" ,+3"+&"+1)6 $"+"/1"! 0 + &+1"/*"!&1" 01"- &+ 1%" !"0&$+ -/, "00 %"6 /" )0, &*-,/1+1 1, 3/&,20 0&*2)1&,+ --)& 1&,+0 +! 0,*"1&*"0 1, #&+&1"8")"*"+1 +)60&0 +! * %&+&+$ &$ 0%,40 0")" 1&,+ ,# +,+*+&#,)! ,!&"0 , 1%" )"#1 &0 ,!&"0 1%1 /" +,+*+2# 12/)" " 20" ,# )"#1 7"/, 1%& (+"00 &+ $"+"/) "+1"/ 7"/, 1%& (+"00 1 "!$"0 +! /&$%1 7"/, 1%& (+"00 1 3"/1& "0 1"#" "- 4,) ."#%(-- #( !(,& " '#& -)&# #- "0#(! 4,) ."#%(-- . !- ( ." ,#!". -)&# #- "0#(! 4,) ."#%5 (-- . 0,.#- " ))&( (!#( #( #.- # ,(. !/#-- #- /- .) "(! )#- 3 ." ,/&- ) ))&( -. )*,.#)(- ( ).", 1),- #. #- & .) )'#( .1) 0)&/'- /-#(! )( ) ." .", -.(, )*,.),- -/.,. /(#. ), #(.,-. " )*,.#)( #- *, ),' )( -)&#- #( ." -' 13 - )( ." -.- ) '."'.#& -. ."),3 " .- ) ." -.(, )*,.#)(- )( -.- ( 0)&/'- , #&&/-.,. #( #! " .1) )#- . ." .)* ) ." *#./, , )'#( #( .", 13- /-#(! ." .", -.(, ))&( )*,.#)(- " ,-/&. ) " ))&( )*,.#)( #- -")1( . ." )..)' )1 .". 1 , +/#** 1#." ." ,#!". %!,)/( 1 ( 2*&), ." 0,#)/- -.!- ) ." ))&( &!),#."'- ) ) ."#- 1 1#&& /- .")/!". 2*,#'(. -/" 2*,#'(., 1#&3 %()1&! - - ( "* ) *, ),' ."#- 2*,#'(. 1 )(&3 ( -)' *#(. -",* %(# ( -)' #'!#(.#)( Coloring. ( ." #,-. -.! )." -)&#- *,.##*.#(! #( ." ))&( )*,.#)( , #&& 1#." # ,(. )&),- &.- -3 3&&)1 ), )( ( &/ ), ." ).", #! -")1- .1) )#- .". "0 ( -. /* ), ))&( )*,.#)( ( )&), ),#(! .) )/, ,/& .- --/' .". /(&#% ,& -)&#- ."3 ( *,'. " ).", 1#.")/. *,)&'- #( ." ))&( )*,.#)( "-(. ( *, ),' 3. ." *#./, -.#&& -")1- .1) #-$)#(. -)&#- .". $/-. "**( .) )0,&* ) -")1 1".- !)#(! )( #(-# ." )#- ." 3&&)1 )3 "- ( ' .,(-*,(. )1 1 ',% ." &#(- 1", ." .1) )#- *,'. " ).", &.- -3 1#." , )&), " , &#(- #( #! , && ." " .1) -)&#- , -.#&& #-$)#(. Union 1) #-$)#(. -)&#- .". "**( .) )0,&* Making Soap Bubbles—Cellular Bodies. ( ." -)( -.! 1 )." -)&#- .)!.", /-#(! ." #(.,-.#)( !,*" -.,/./, 0,3 -#'#&, .) .")- ),' 3 -)* /&- #,. - -")1( #( #! " .1) -)&#- ()1 "(! .)5 !.", . ." #(.,-.#)( !,*" ( ." -* 1", )." )#- )0,&* !,( )&), ( -( "#- #- ." '#25 ./, ) 3&&)1 ( &/ ) !. .., 0#-#)( ) ." !)5 '.,# -#./.#)( -)' - "0 ( ' .,(-*,(. Intersection Subtraction -/&.- ) **&3#(! ." -.(, ))&( -. )*,.#)(.) .1) -)&# )#- (.,-.#)( !,*" , .), 1&..5%, )/,(& 342"*()4 ,*.& $*2$,& &,,*03& /2 30,*.& . 4)& '/,,/7*.( %*3$53; 3*/. 4)& (&/-&42*$ 35#$,"33&3 "2& 53&% '/2 *,,5342"4*/. 052; 0/3&3 #54 4)& //,&". ",(/2*4)- *43&,' %/&3 ./4 %&0&.% /. ".9 30&$*'*$ (&/-&429 490&3 3*.$& *4 *3 *-0,&-&.4&% *. " (&.&2*$ 7"9 "$) (&/-&429 $,"33 )"3 " $/22&30/.%*.( 4/0/,/(*$", $"22*&2 4)"4 0543 *4 *.4/ 0&230&$4*6& *. 4)& $/.4&84 /' " 3/,*% -/%&, )& 4"#,& #&,/7 3)/73 4)*3 2&,"4*/.3)*0 " !&24&8 %(& "$& " /*.4 526& 52'"$& )& 4/0/,/(*$", &.4*4*&3 '"$& ".% &%(& "2& $"22*&23 #&$"53& 4)&9 ./4 /.,9 4)&*2 (&/-&42*&3 #54 ",3/ /2 4)&- / 5.%&234".% 7)"4 4)*3 -&".3 7& -534 2&",; *:& 4)"4 -/34 (&/-&42*&3 "2& /' *.'*.*4& &84&.4 ".% &6&. *' 4)&9 "2& '*.*4& /.,9 " 3-",, 3&(-&.4 -*()4 #& /' *.4&2&34 &35,4 /' +.*44*.( 4)& 47/ #/%*&3 4/(&4)&2 "4 4)& *.4&23&$4*/. (2"0) )//3*.( " //,&". /0&2"4*/. *3 ./7 &15*6",&.4 4/ %&$*%*.( 7)*$) $/,/23 4/ +&&0 ".% 7)*$) 4/ %&,&4& Getting Rid of the Wrong Colors. . 4)& 4)*2% ".% ,"34 34"(& /' /52 *-"(*."29 02/$&33 ./4 -5$) *3 ,&'4 4/ %/ 0 4/ ./7 7& )"6& ./4 3"*% 7)*$) +*.% /' //,&". /0&2"4*/. 5.*/. 35#; 42"$4*/. /2 *.4&23&$4*/. 7& 7".4&% /7 *3 4)& 4*-& 4/ %&$*%& / (&4 4)& %&3*2&% 2&35,4 7& 3*-0,9 0*$+ 4)& "002/02*"4& $/,/2 ".% (&4 2*% /' ",, 6/,5-&3 /' " %*''&2&.4 $/,/2 4)". 4)& /.& 7& 0*$+&% .*4*",,9 7& $)/3& 47/ $/,/23<#,5& ".% 9&,; ,/7<3/ 7& 7*,, '*.% 4)2&& $/,/23 *. /52 3/"0 #5##,& $,534&2 #,5& 9&,,/7 ".% (2&&. . 2&(*/.3 7)&2& #,5& ".% 9&,,/7 6/,5-&3 /6&2,"0 7& (&4 (2&&. )& 4"#,& #&,/7 3)/73 7)*$) $/,/23 7*,, #& +&04 /2 %&,&4&% '2/- 4)& #/%9 %&0&.%; *.( /. 4)& 0"24*$5,"2 490& /' //,&". /0&2"4*/. 7& $)//3& • ! #,5& ".% 9&,,/7 9&,,/7 (2&&. (2&&. (2&&. ".% #,5& #,5& ".% 9&,,/7 "39 *3.4 *4 "4 9/523&,' /. 4)& #"$+ ".% $,&". 50 4)& -&33 /' 0"*.4 ".% $)*00&%;/'' 0*&$&3 . 4)& 02&$&%*.( &8"-0,& 7& /.,9 )"% 4/ -"2+ 4)& ,*.&3 7)&2& 4)& $/,/2 $)".(&3 4/ /#4"*. 4)& *.4&23&$4*/. (2"0) )& //,&". &.(*.& ",(/2*4)- 4)"4 %/&3 4)*3 *3 " #*4 -/2& $/-0,&8 / 5.%&234".% *4 7& -534 "("*. ,//+ "4 4)& -"4)&; -"4*$", 2&02&3&.4"4*/. /' " 3/,*% . *( 7& )"6& 3&&. 4)& (&.&2", %"4" 3425$452& ,"9/54 /' " $9,*.%&2 )"4 3+&4$) )/7; &6&2 ,"$+3 ".9 &80,*$*4 2&'&2&.$&3 4/ (&/-&429 . /,*%&3*(.&23 ;&0 3425$452& 4)2&& #"3& $,"33&3 /' (&/-; &42*&3 "2& 53&% 0/*.43 $526&3 ".% 352'"$&3 )& ,"34 47/ )"6& 3&6&2", 35#$,"33&3 /2 &8"-0,& " $526& $". #& " $4/#&2 &7,&44;"$+"2% /52.", *( &8&-0,*'*&3 4)& 2&,"4*/.3)*0 #&47&&. 4/0/,/(9 ".% (&/-&429 //+*.( "4 4)& $9,*.%&2 3' ./4*$& 4)"4 /.,9 " 3&(-&.4 /' 4)& /4)&27*3& *.'*.*4& $9,*.%2*$", 352'"$& *3 53&% )*3 3&(-&.4 *3 $",,&% " '"$& '" *+&7*3& /.,9 47/ $*2$5; ,"2 2&(*/.3 /' 4)& /4)&27*3& *.'*.*4& 0,".&3 3' ".% 3' "2& 53&% 4/ $,/3& 4)& $9,*.%&2 )& $*2$5,"2 2&(*/.3 "2& '"$& '" ".% '"$& '" /4& )& 4/0 ".% #/44/- '"$&3 /' 4)& $9,*.; %&2 )"6& #&&. ,*'4&% /'' " #*4 '/2 #&44&2 %&-/.342"4*/. )& %/5#,& 9&,,/7 &%(&3 $/*.$*%& *. 2&",*49 )& $/.$&04 /' 42*--&% 352'"$&3 *3 &33&.4*", '/2 4)& .&84 3&$4*/. #&$"53& *4 *.42/%5$&3 3/-& 5.&80&$4&% $/-0,*$"; 4*/.3 7)&. $/.3425$4*.( 4)& *.4&23&$4*/. (2"0) Constructing the Intersection Graph. "2,*&2 7& 3*-0,9 53&% ". &8$&,,&.4 0"44&2. 2&$/(.*:&2 $",,&% 4)& )5-". #2"*. 4/ '*.% 4)& ,*.&3 7)&2& 4)& $/,/2 $)".(&3 &"$)*.( 4)*3 "#*,*49 4/ " $/-054&2 *.6/,6&3 " $/.3*%&2"#,& "-/5.4 /' -"4)&-"4*$3 *( 3)/73 4)& $/.3425$4*/. /' /.& 3&(-&.4 /' ". *.4&23&$; 4*/. (2"0) " (2"0) &%(& )& %2"7*.( 3)/73 47/ *.4&23&$4; *.( 352'"$&3 3' ".% 3' $"229*.( 47/ '"$&3 '" ".% '" / $/.3425$4 4)& (2"0) &%(& 4)& 0*&$& /' 4)& *.4&23&$4*/. 42"$+ *.3*%& #/4) '"$&3 4)& '/,,/7*.( 34&03 "2& 2&15*2&% )& 47/ 5.#/5.%&% 352'"$&3 3' ".% 3' "2& *.4&23&$4&% (*6*.( 4)& *.4&23&$4*/. 42"$+ 42"$+ sf3 (Cylinder) fa1 fa2 fa3 y y sf1 (Plane) x sf2 (Plane) x . &8"-0,& /' 4)& 2&,"4*/.3)*0 #&47&&. 4/0/,/(9 ".% (&/-&429 "$&3 ".% &%(&3 #/5.% /2 42*- 4)&*2 (&/-&42*&3 7)*$) $/.3*34 /' *.'*.*4& $526&3 ".% 352'"$&3 sf1 Graph Edge fa2 i4 fa1 Track i2 i3 sf2 i1 ,+01/2!1',+ ,$ ,+# 0#%*#+1 ,$ + '+1#/0#!1',+ %/-& %/-& #"%# • &# #"%#0 ,$ $ /# '+1#/0#!1#" 4'1& 02/$!# 0$ 1, 6'#)" 1&# #"%#02/$!# '+1#/0#!1',+ -,'+10 ' +" ' '*')/)6 1&# #"%#0 ,$ $ /# '+1#/0#!1#" 4'1& 0$ %'3'+% 1&# '+1#/0#!1',+ -,'+10 ' +" ' • &# '+1#/0#!1',+ -,'+10 /# ,/"#/#" ),+% 1&# 1/!( • &# ,/"#/#" -,'+10 /# #5*'+#" $,/ 1&#'/ &# --/,!& 3)2#0 0'*-)6 1#)) '$ $!# '0 #+1#/#" ,/ )#$1 4&#+ -00'+% -/1'!2)/ -,'+1 &'0 '+$,/*1',+ !+ # 20#" 1, "#"2!# 1&# !,+1'+*#+1 ,$ 0#%*#+1 ,$ 1&# '+1#/7 0#!1',+ %/-& 4'1& /#0-#!1 1, '10 %#+#/1'+% $!#0 &# --/,!& +" !,+1'+*#+1 3)2#0 $,/ 1&# '+1#/0#!1',+ -,'+10 '+ 1&# -/#3',20 "/4'+% /# ' ' ' ' ,210'"# ,210'"# #+1#/'+% $ '+0'"# ,210'"# #+1#/'+% $ '+0'"# '+0'"# )#3'+% $ ,210'"# '+0'"# )#3'+% $ ,210'"# ,210'"# &# +2* #/ ,$ /#.2'/#" '+1#/0#!1',+0 %/,40 /-'")6 .27 "/1'!))6 4'1& 1&# !,*-)#5'16 +2* #/ ,$ $!#0 ,$ 1&# 0,)'"0 ,/12+1#)6 1&# "'$$#/#+1 $!#$!# '+1#/0#!1',+0 !+ # #0')6 -#/$,/*#" '+ -/))#) &# )%,/'1&* '0 01/2!12/#" 02!& 1&1 '1 !+ !/#1# !0!"# ,$ 0,/1 ,$ 02 -/,7 !#00 ,/ #!& -'/ ,$ $!#0 02 -/,!#00 '0 )2+!&#" 1&1 0-)'10 '10#)$ 1, !)!2)1# 1&# 02/$!#02/$!# '+1#/0#!1',+0 +" 1&# #"%#02/$!# '+1#/0#!1',+0 '+ -/))#) '1& 1&# 3') ')7 '16 ,$ *2)1'-/,!#00,/ &/"4/# 1&# "3+1%#0 ,$ 1&'0 )%,7 /'1&*'! 01/2!12/# /# 0##+ 0 '+!/#0#" -#/$,/*+!# ,$ 1&# ,,)#+ ,-#/1',+0 Imprinting and Coloring. + 1&# '+12'1'3# --/,!& !,),/'+% 1&# $!#0 1&1 '0 "#1#/*'+'+% 4&'!& -'#!#0 /# '+0'"# ,/ ,210'"# 40 +, -/, )#* #!20# '1 !,2)" #0')6 # 0##+ + 1&# *!&'+# )#3#) ,1&#/ *#+0 /# /#.2'/#" +1#/0#!1',+ 1/!(0 0-)'1 02/$!#0 +" $!#0 '+1, )#$1 +" /'%&1 &)3#0 ""'1',+))6 02/$!#0 0-)'1 0-!# '+1, &)3#0 !))#" # !+ !)00'$6 #!& -'#!# ,$ 1&# 0-)'1 $!# 1, &)$ 0-!# 4'1& /#0-#!1 1, 1&# ,1&#/ 02/$!# &'0 -/,!#"2/# '0 "#*,+01/1#" '+ '% )00'$'!1',+ '0 ",+# 4'1& /#0-#!1 1, 1&# 02/$!# +,/*)0 !,),/#" //,40 ,$ ,1& 02/$!#0 0$ +" 0$ +" 1&# '+1#/7 0#!1',+ 1/!( 1 '0 #06 1, 0## 1&1 1&# ,,)#+ #+%'+# '0 "/'3'+% *,01 *7 !&'+'+% ,-#/1',+0 #/# /# 0,*# --)'!1',+0 '+ 4&'!& '1 '0 +,1 0, , 3',20 Partial Booleans. #%2)/ ,,)#+ ,-#/1',+0 11#*-1 1, !)!27 )1# )) '+1#/0#!1',+ 1/!(0 #14##+ ,"'#0 + !,+1/01 -/1') ,,)#+ ,-#/1',+0 !)!2)1# ,+)6 ,+# '+1#/0#!1',+ 1/!( &'!& ,+# "#-#+"0 ,+ 1&# -/1'!2)/ --)'!1',+ +# #57 *-)# ,$ -/1') ,,)#+ ,-#/1',+ '+ ,)'"#0'%+#/ '0 4/--#" '+1, 1&# #51/2"#71,7-/1 !,**+" 1 $'/#0 -/,7 $')# "#$'+#" '+ 4,/(-)+# ,+1, ,"6 0 0&,4+ '+ '% &# -'!12/# 0&,40 ,"6 +" -/,$')# 0#1 2- $,/ 1&# Intersection Track • &# 0#%*#+10 ,$ 1&# '+1#/0#!1',+ %/-& '+0'"# ,1& $!#0 /# 20#" 1, !/#1# 1&# %/-& #"%#0 ,$ -/1'!2)/ '+1#/0#!1',+ + 1&'0 #5*-)# ,+)6 1&# 0#%*#+1 ,2+"#" 6 ' +" ' $2)$'))0 1&'0 !,+"'1',+ Parallelism. &# !,*-)#1# '+1#/0#!1',+ %/-& ,$ 14, ,"'#0 '0 , 1'+#" 6 -'/4'0# '+1#/0#!1',+ ,$ $!#0 0#)#!1#" $/,* ,1& 0,)'"0 &# +2* #/ ,$ /#.2'/#" $!#$!# '+1#/0#!1',+0 "#7 -#+"0 ,+ 1&# +2* #/ ,$ $!#0 '+ ,1& 0,)'"0 ' +* 4&#/# ' '0 1&# +2* #/ ,$ '+1#/0#!1',+0 + '0 1&# +2* #/ ,$ $!#0 '+ ,+# ,"6 +" * '0 1&# +2* #/ ,$ $!#0 '+ 1&# ,1&#/ ,"6 Outside sf2 sf1 sf2 Inside sf1 Outside sf1 Inside sf2 2/$!#0 0-)'1 0-!# '+1, &)3#0 !))#" &)$ 0-!#0 '+0'"# +" ,210'"# ),+% 02/$!# +,/*)0 !& -'#!# ,$ 0-)'1 02/$!# !+ # !)00'$'#" 0 #),+%'+% 1, &)$ 0-!# 4'1& /#0-#!1 1, 1&# ,1&#/ 02/$!# !1, #/ #4)#117!(/" ,2/+) The robustness of Boolean operations between solids is crucial for the usability of a solid modeler like HP PE/SolidDesigner. Unfortunately, geometric modeling is like shoveling sand. With every shovel you pick up a bit of dirt. The numerically imperfect nature of geometric algorithms can challenge HP PE/SolidDesigner’s Boolean engine with contradictions and inconsistencies. The Boolean engine uses a perturbation method1,2 to push the frontier of robustness. This article explains the notion of model consistency and demonstrates what can go wrong inside a Boolean operation and what can be done to come up with a correct result anyway. Consistency of a Solid Looking at a solid we usually believe that it is mathematically correct, that is, that the edges are exactly on their adjacent faces and the edges meet exactly at their common vertices. In reality, however, the limited floating-point accuracy of a computer introduces errors. On the microscopic level there are gaps and holes everywhere (see Fig. 1). The tolerable amount of error is specified by the modeling resolution. The system will ignore gaps and holes smaller than the resolution. However, some geometric algorithms, such as the various intersection calculations, tend to magnify errors in certain geometric configurations. This means that given an input where all errors are within limits, the result can be inconsistent in the context of the solid and prohibit the successful completion of the requested Boolean operation. Solving the Numerical Puzzle One area in the Boolean operation that is particularly vulnerable to numerical inconsistencies is the intersection graph construction. The graph construction assumes that all intersections of curves defined on one of two intersecting surfaces are also on the intersection track (here the term on means closer than the resolution). This is no problem if the surfaces are reasonably orthogonal. However, for intersections between tangential or almost tangential surfaces, a small error in the orthogonal direction of a surface implies a larger error in the direction of the surface, and this assumption becomes false. Fig. 2 shows a shallow intersection between the two surfaces sf1 and sf2 and the intersection with sf2 of a curve (cv) contained in sf1. The curve/surface intersection point (small colored triangle) has, because of the small distance (epsilon) between cv and its containing surface sf1, moved farther away from the surface/surface intersection track (colored line) than the resolution permits. The smaller the angle the larger the distance d from the intersection track and hence the larger the inconsistency. cv ∩ sf2 epsilon cvŮsf1 sf1 ∩ sf2 d d= sf1 epsilon sin sf2 Fig. 1. In solid models edges seem to be exactly on their adjacent faces and meet exactly at their common vertices. In reality, because of the limited floating-point accuracy of a computer, on the microscopic level there are gaps and holes everywhere. Fig. 2. A shallow intersection between the two surfaces sf1 and sf2 and the intersection with sf2 of a curve (cv) contained in sf1. '#!$)#) !# !# ( # #!"# ! &! # '#!$ ! #" # ( " $" # $ # !"$# # !# " # !"$# # !# "$( # '#!$ ! &$ '# # ( # # ## !$ " #!"# ! Reflection of Solids. #! $$"$ # " # !# "" # "&" ( &# ! !# "# $ # # !# " # !"$# # !# !# ( ! "# $ ! '#!$)#) !# !# # !# " # !"$# # !# #! &##)! $! " !# "$# &# !$! !) #" ( ( !!! $# # # ( &) %! #" &$ $! # &# $# ## #!"#" "# # !# #!) "#" # # ( &# # !# # # #!"# ! & $" # $ # # ( Fortunately, there is a method called perturbation than can come to the rescue in situations like this. It solves the inconsistency by moving the curve/surface intersection point along the curve until it is closer than the resolution to the surface/surface intersection track. In Fig. 2 the point will be moved to the left. When the intersection point is moved, a new error is introduced because the point is moved away from sf2. However, the overall error is reduced so that it no longer exceeds the resolution. The perturbation method can be applied to similar situations in which even the number of intersections has to be corrected. The difference in number is a result the freedom algorithms have below the resolution. They may return anything in the range of the resolution. Two Curve/Surface Intersection Points with One Surface/Surface Intersection Track. Fig. 3 shows a geometric configuration in which the intersection between sf1 and sf2 yields one intersection track (colored line) but the intersection of the curve contained in sf1 with sf2 gives two intersection points (colored triangles) which are farther than the resolution away from the track. The perturbation algorithm moves both points inwards (horizontal arrows) and contracts them into a single point (black triangle) which is closer than the resolution to the intersection track (colored line). Two Surface/Surface Intersection Tracks with One Curve/Surface Intersection Point. Fig. 4 shows a geometric configuration in which the intersection between sf1 and sf2 yields two intersection tracks (colored lines) but the intersection of the curve contained in sf1 with sf2 gives one intersection point (colored triangle) which is farther than the resolution away from the tracks. The perturbation algorithm splits the single intersection into two and moves them outwards (horizontal arrows) until both are closer than the resolution to an intersection track (colored line). References 1. H. Edelsbrunner and E. Mucke, “Simulation of simplicity: A technique to cope with degenerate cases in geometric algorithms,” Proceedings of the 4th ACM Symposium on Computational Geometry, June 1988, pp. 118-133. 2. C. K. Yap, “A geometric consistency theorem for a symbolic perturbation theorem,” ibid, pp. 134-142. sf2 sf2 cv ∩ sf2 cv ∩ sf2 cv ∩ sf2 epsilon epsilon sf1 ∩ sf2 sf1 sf1 ∩ sf2 sf1 Fig. 3. A geometric configuration in which the intersection between sf1 and sf2 yields one intersection track (colored line) but the intersection of the curve contained in sf1 with sf2 gives two intersection points (colored triangles) which are farther than the resolution away from the track. Fig. 4. A geometric configuration in which the intersection between sf1 and sf2 yields two intersection tracks (colored lines) but the intersection of the curve contained in sf1 with sf2 gives one intersection point (colored triangle) which is farther than the resolution away from the tracks. ! &% $$"$ "#* &"&$ !&$%&"! )& & $$"$ #! % !* "$&""! ! $&(* %* &" #$+ "$ " #$ &" & &!!& !&$%&"!% ("# !& " & ""! "$& % !("( !* #"# # &!% &" "$ $ $! ("# !& & $% $ !! $ ! ! &( ' ! #$"& !$ $!%& %)! !&* " #'&$ ! $%% "* )& $! $&"! #! %& '# ! & $& & $%'& " & $& "#$&"! &"$ )&&+$ "'$!