# # Examples of the Convex Hull of Surfaces. # # Joon-Kyung Seong, November 2002 # save_res = resolution; ############################################################################## # # The Convex hull of two surfaces # c = cbspline( 3, list( ctlpt( e2, -1, -1 ), ctlpt( e2, -1, 1 ), ctlpt( e2, 1, 1 ), ctlpt( e2, 1, -1 ) ), list ( kv_periodic ) ); c = coerce( c, kv_open ); ellip1 = sFromCrvs( list( c * sc( 0.001 ), c, c * tz( 2.4 ), c * sc( 0.001 ) * tz( 2.4 ) ) , 3, kv_open ); ellip2 = sFromCrvs( list( c * ry( 45 ) * sc( 0.001 ) * tz( 1.5 ) * tx( 2 ), c * ry( 45 ) * tz( 1.5 ) * tx( 2 ), c * ry( 45 ) * tz( 3.5 ) * tx( 4 ), c * ry( 45 ) * sc( 0.001 ) * tz( 3.5 ) * tx( 4 ) ) , 3, kv_open ); Srfs = list( ellip1, ellip2 ); ch = CNVXHULL( Srfs, 0.2 ); interact( list( Srfs, ch, axes ) ); # # In two-surfaces-case, the following call gives you # the same results to that of the above. # attrib( Srfs, "tangency", true ); ch1 = CNVXHULL( Srfs, 0.2 ); interact( list( Srfs, ch1, axes ) ); # # you can also get a more accurate result # ch2 = CNVXHULL( Srfs, 0.1 ); save( "scnvhul1", list( Srfs, ch, ch1, ch2 ) ); interact( list( Srfs, ch2, axes ) ); # # Another simple example(two-surfaces-case) # c1 = cregion( pcircle( vector( 0, 0, 0 ), 1 ), 1, 3 ); view( list( c1, axes ), 1 ); s1 = surfPRev( c1 * ry( 90 ) ); view( list( s1, axes ), 1 ); s2 = s1 * sx( 0.7 ) * sx( 0.45 ) * tz( 3 ) * tx( 0.2 ) * ty( 0.1 ); Srfs = list( s1, s2 ); view( list( Srfs, axes ), 1 ); attrib( Srfs, "tangency", 1 ); ch3 = CNVXHULL( Srfs, 0.1 ); interact( list( Srfs, ch3, axes ) ); ##################################################################### # # Example for three surfaces case # ellip3 = sFromCrvs( list( c * ry( 70 ) * sc( 0.001 ) * tz( 3.5 ) * tx( -1 ), c * ry( 70 ) * tz( 3.5 ) * tx( -1 ), c * ry( 70 ) * tz( 6 ) * tx( 3 ), c * ry( 70 ) * sc( 0.001 ) * tz( 6 ) * tx( 3 ) ) , 3, kv_open ) * rx( 180 ) * tz( 3 ) * tx( 1 ); Srfs = list( ellip1, ellip2, ellip3 ); view( list( Srfs, axes ), 1 ); attrib( Srfs, "tangency", 0 ); ch4 = CNVXHULL( Srfs, 0.2 ); interact( list( Srfs, ch4, axes ) ); ################################################################### # # more complex surface # s = sFromCrvs( list( c * sc( 0.001 ), c, c * tz( 2 ), c * sc( 0.1 ) * tz( 2.4 ) , c * sc( 1.6 ) * ry( 45 ) * tz( 3 ) * tx( 0.5 ), c * sc( 1.21 ) * ry( 85 ) * tz( 3.2 ) * tx( 1.8 ), c * ry( 86 ) * sc( 0.1 ) * tz( 3.5 ) * tx( 2 ), c * sc( 1.5 ) * ry( 70 ) * tz( 3.7 ) * tx( 3.2 ), c * sc( 1.2 ) * ry( 75 ) * tz( 4 ) * tx(4 ), c * sc(0.7) * ry( 75 ) * tz( 4.4 ) * tx( 5 ), c * sc( 0.001 ) * ry( 75 ) * tz( 4.4 ) * tx( 5 ) ), 3, kv_open ); view( list( s, axes ), 1 ); # # Let's seperate the surface into three patch. # s1 = sFromCrvs( list( c * sc( 0.001 ), c, c * tz( 2 ), c * sc( 0.4 ) * tz( 2.2 ), c * sc( 0.1 ) * tz( 2.4 ) ), 3, kv_open ); s2 = sFromCrvs( list( c * sc( 0.1 ) * tz( 2.4 ) , c * sc( 0.53 ) * ry( 45 ) * tz( 2.55 ) * tx( 0.18 ), c * sc( 1.56 ) * ry( 45 ) * tz( 3 ) * tx( 0.5 ), c * sc( 1.21 ) * ry( 85 ) * tz( 3.2 ) * tx( 1.8 ), c * sc( 0.5 ) * ry( 85 ) * tz( 3.3 ) * tx( 1.9 ), c * ry( 86 ) * sc( 0.1 ) * tz( 3.5 ) * tx( 2 ) ), 3, kv_open ); s3 = sFromCrvs( list( c * ry( 86 ) * sc( 0.1 ) * tz( 3.5 ) * tx( 2 ), c * sc( 1.55 ) * ry( 70 ) * tz( 3.7 ) * tx( 3.2 ), c * sc( 1.2 ) * ry( 75 ) * tz( 4 ) * tx(4 ), c * sc(0.7) * ry( 75 ) * tz( 4.4 ) * tx( 5 ), c * sc( 0.001 ) * ry( 75 ) * tz( 4.4 ) * tx( 5 ) ), 3, kv_open ); Srfs = list( s1, s2, s3 ); ch5 = CNVXHULL( Srfs, 0.2 ); interact( list( Srfs, ch5, axes ) ); ##################################################################### ## test for three-tangencies ts1 = sFromCrvs( list( c * sc( 0.001 ), c, c * tz( 2 ), c * sc( 0.1 ) * tz( 2.4 ) , c * sc( 1.6 ) * ry( 45 ) * tz( 3 ) * tx( 0.5 ), c * sc( 1.21 ) * ry( 85 ) * tz( 3.2 ) * tx( 1.8 ), c * ry( 86 ) * sc( 0.1 ) * tz( 3.5 ) * tx( 2 ), c * sc( 0.001 ) * ry( 86 ) * tz( 3.5 ) * tx( 2 ) ), 3, kv_open ); ts2 = ellip1 * tx( 4.0 ) * tz( 2.5 ); ts3 = ellip2 * tz( -2.0 ); Srfs = list( ts1, ts2, ts3 ); view( list( Srfs, axes ), 1 ); attrib( Srfs, "tangency", 1 ); ch6 = CNVXHULL( Srfs, 0.4 ); interact( list( Srfs, ch6, axes ) ); free( ts1 ); free( ts2 ); free( ts3 ); free( Srfs ); free( ellip1 ); free( ellip2 ); free( ellip3 ); free( c ); free( s ); free( c1 ); free( s1 ); free( s2 ); free( s3 ); free( ch ); free( ch1 ); free( ch2 ); free( ch3 ); free( ch4 ); free( ch5 ); free( ch6 );