# # Minimum Spanning Circle and Convex Hull for polys. # # Gershon Elber, February 1996 # save_mat = view_mat; view_mat = sc( 0.5 ); viewobj( view_mat ); view_mat = save_mat; ri = iritstate( "RandomInit", 1964 ); # Seed-initiate the randomizer, free( ri ); RandomPts = function( n ): l: i: t: r: l = nil(): for ( i = 1, 1, n, r = random( -1, 1 ): t = random( 0, 2 * pi ): snoc( vector( cos( t ) * r, sin( t ) * r, 0 ), l ) ): return = poly( l, false ): color( return, red ): adwidth( return, 5 ); RandomVecs = function( n ): l: i: t: r: l = nil(): for ( i = 1, 1, n, r = random( -1, 1 ): t = random( 0, 2 * pi ): snoc( vector( cos( t ) * r, 2.0, sin( t ) * r ), l ) ): return = l: color( return, red ): adwidth( return, 3 ); GenRandomCrv = function( d, n, size ): CtlPts: CPt: i: CtlPts = nil(): for ( i = 1, 1, n, snoc( ctlpt( E2, random( -size, size ), random( -size, size ) ), CtlPts ) ): return = cbspline( d, CtlPts * tx( random( -1, 1 ) ) * ty( random( -1, 1 ) ), list( kv_periodic ) ): return = coerce( return, kv_open ); RandomCrvs = function( NumCrvs, CrvDeg, CrvLen, size ): i: l: l = nil(): for ( i = 1, 1, NumCrvs, snoc( GenRandomCrv( CrvDeg, CrvLen, size ), l ) ): return = l: color( return, red ): adwidth( return, 3 ); ############################################################################# # # Points # n = 4: while ( n <= 1024, printf( "Processing %4d pts...", list( n ) ): p = RandomPts( n ): ch = cnvxhull( p, 0 ): color( ch, green ): adwidth( ch, 2 ): msc = mscirc( p, 0 ): cntr = getattr( msc, "center" ): rad = getattr( msc, "radius" ): color( msc, yellow ): adwidth( msc, 2 ): view( list( p, msc, ch ), 1 ): printf( "done (Center = %.5lg %.5lg, Radius = %.5lg).\\n", list( coord( cntr, 0 ), coord( cntr, 1 ), rad ) ): # pause(): miliSleep( 1000 ): n = n * 2 ); save( "msc_ch1", list( ch, msc, p ) ); interact( list( ch, msc, p ) ); ############################################################################# # # Vectors # n = 4: while ( n <= 1024, printf( "Processing %4d vecs...", list( n ) ): p = RandomVecs( n ): msc = mscirc( p, 0 ): cntr = getattr( msc, "center" ): rad = getattr( msc, "angle" ): color( msc, yellow ): attrib( p, "UseAvg", 1 ): msc2 = mscirc( p, 0 ): cntr2 = getattr( msc2, "center" ): rad2 = getattr( msc2, "angle" ): color( msc2, cyan ): view( list( msc, msc2, axes, p ), 1 ): printf( "done Radius1 = %.5lg Radius2 = %.5lg.\\n", list( rad, rad2 ) ): # pause(): miliSleep( 1000 ): n = n * 2 ); save( "msc_ch2", list( msc2, msc, p ) ); interact( list( msc2, msc, p ) ); ############################################################################# # # Curves # testRun = function( NumCrvs, CrvDeg, CrvLen, size, Seed ): ri: c: msc: ri = iritstate( "RandomInit", Seed ): c = RandomCrvs( NumCrvs, CrvDeg, CrvLen, size ): msc = mscirc( c, list( 0.5 / CrvLen, 1e-10 ) ): return = list( msc, c ); interact( a = testRun( 6, 3, 3, 0.85, 1 ) ); interact( b = testRun( 16, 3, 4, 0.15, 1 ) ); interact( c = testRun( 2, 3, 4, 0.85, 1 ) ); interact( d = testRun( 3, 3, 3, 0.85, 1 ) ); interact( e = testRun( 15, 3, 3, 0.85, 1 ) ); save( "msc_ch3", list( a * tx( -5 ) * ty( -1 ), b * tx( -2 ), c * tx( 0.4 ), d * tx( 3.9 ) * ty( -1 ), e * tx( 7 ) * ty( -0.2 ) ) ); free( a ); free( b ); free( c ); free( d ); free( e ); # # These are slow # comment $ view( testRun( 35, 3, 3, 0.35, 1 ), 1 ); view( testRun( 35, 3, 6, 0.35, 1 ), 1 ); view( testRun( 2, 4, 5, 0.85, 1964 ), 1 ); view( testRun( 3, 4, 5, 0.85, 1964 ), 1 ); $ ############################################################################# free( n ); free( p ); free( ch ); free( msc ); free( cntr ); free( rad ); free( msc2 ); free( cntr2 ); free( rad2 );