# # The infamous Teapot data as four B-spline surfaces. # EchoSrc = iritState("EchoSource", false); save_mat = view_mat; Body = sbspline( 4, 4, list( list( ctlpt( E3, 1.4, 2.25, 0 ), ctlpt( E3, 1.3375, 2.38125, 0 ), ctlpt( E3, 1.4375, 2.38125, 0 ), ctlpt( E3, 1.5, 2.25, 0 ), ctlpt( E3, 1.75, 1.725, 0 ), ctlpt( E3, 2, 1.2, 0 ), ctlpt( E3, 2, 0.75, 0 ), ctlpt( E3, 2, 0.3, 0 ), ctlpt( E3, 1.5, 0.075, 0 ), ctlpt( E3, 1.5, 0, 0 ) ), list( ctlpt( E3, 1.4, 2.25, 0.784 ), ctlpt( E3, 1.3375, 2.38125, 0.749 ), ctlpt( E3, 1.4375, 2.38125, 0.805 ), ctlpt( E3, 1.5, 2.25, 0.84 ), ctlpt( E3, 1.75, 1.725, 0.98 ), ctlpt( E3, 2, 1.2, 1.12 ), ctlpt( E3, 2, 0.75, 1.12 ), ctlpt( E3, 2, 0.3, 1.12 ), ctlpt( E3, 1.5, 0.075, 0.84 ), ctlpt( E3, 1.5, 0, 0.84 ) ), list( ctlpt( E3, 0.784, 2.25, 1.4 ), ctlpt( E3, 0.749, 2.38125, 1.3375 ), ctlpt( E3, 0.805, 2.38125, 1.4375 ), ctlpt( E3, 0.84, 2.25, 1.5 ), ctlpt( E3, 0.98, 1.725, 1.75 ), ctlpt( E3, 1.12, 1.2, 2 ), ctlpt( E3, 1.12, 0.75, 2 ), ctlpt( E3, 1.12, 0.3, 2 ), ctlpt( E3, 0.84, 0.075, 1.5 ), ctlpt( E3, 0.84, 0, 1.5 ) ), list( ctlpt( E3, 0, 2.25, 1.4 ), ctlpt( E3, 0, 2.38125, 1.3375 ), ctlpt( E3, 0, 2.38125, 1.4375 ), ctlpt( E3, 0, 2.25, 1.5 ), ctlpt( E3, 0, 1.725, 1.75 ), ctlpt( E3, 0, 1.2, 2 ), ctlpt( E3, 0, 0.75, 2 ), ctlpt( E3, 0, 0.3, 2 ), ctlpt( E3, 0, 0.075, 1.5 ), ctlpt( E3, 0, 0, 1.5 ) ), list( ctlpt( E3, -0.784, 2.25, 1.4 ), ctlpt( E3, -0.749, 2.38125, 1.3375 ), ctlpt( E3, -0.805, 2.38125, 1.4375 ), ctlpt( E3, -0.84, 2.25, 1.5 ), ctlpt( E3, -0.98, 1.725, 1.75 ), ctlpt( E3, -1.12, 1.2, 2 ), ctlpt( E3, -1.12, 0.75, 2 ), ctlpt( E3, -1.12, 0.3, 2 ), ctlpt( E3, -0.84, 0.075, 1.5 ), ctlpt( E3, -0.84, 0, 1.5 ) ), list( ctlpt( E3, -1.4, 2.25, 0.784 ), ctlpt( E3, -1.3375, 2.38125, 0.749 ), ctlpt( E3, -1.4375, 2.38125, 0.805 ), ctlpt( E3, -1.5, 2.25, 0.84 ), ctlpt( E3, -1.75, 1.725, 0.98 ), ctlpt( E3, -2, 1.2, 1.12 ), ctlpt( E3, -2, 0.75, 1.12 ), ctlpt( E3, -2, 0.3, 1.12 ), ctlpt( E3, -1.5, 0.075, 0.84 ), ctlpt( E3, -1.5, 0, 0.84 ) ), list( ctlpt( E3, -1.4, 2.25, 0 ), ctlpt( E3, -1.3375, 2.38125, 0 ), ctlpt( E3, -1.4375, 2.38125, 0 ), ctlpt( E3, -1.5, 2.25, 0 ), ctlpt( E3, -1.75, 1.725, 0 ), ctlpt( E3, -2, 1.2, 0 ), ctlpt( E3, -2, 0.75, 0 ), ctlpt( E3, -2, 0.3, 0 ), ctlpt( E3, -1.5, 0.075, 0 ), ctlpt( E3, -1.5, 0, 0 ) ), list( ctlpt( E3, -1.4, 2.25, -0.784 ), ctlpt( E3, -1.3375, 2.38125, -0.749 ), ctlpt( E3, -1.4375, 2.38125, -0.805 ), ctlpt( E3, -1.5, 2.25, -0.84 ), ctlpt( E3, -1.75, 1.725, -0.98 ), ctlpt( E3, -2, 1.2, -1.12 ), ctlpt( E3, -2, 0.75, -1.12 ), ctlpt( E3, -2, 0.3, -1.12 ), ctlpt( E3, -1.5, 0.075, -0.84 ), ctlpt( E3, -1.5, 0, -0.84 ) ), list( ctlpt( E3, -0.784, 2.25, -1.4 ), ctlpt( E3, -0.749, 2.38125, -1.3375 ), ctlpt( E3, -0.805, 2.38125, -1.4375 ), ctlpt( E3, -0.84, 2.25, -1.5 ), ctlpt( E3, -0.98, 1.725, -1.75 ), ctlpt( E3, -1.12, 1.2, -2 ), ctlpt( E3, -1.12, 0.75, -2 ), ctlpt( E3, -1.12, 0.3, -2 ), ctlpt( E3, -0.84, 0.075, -1.5 ), ctlpt( E3, -0.84, 0, -1.5 ) ), list( ctlpt( E3, 0, 2.25, -1.4 ), ctlpt( E3, 0, 2.38125, -1.3375 ), ctlpt( E3, 0, 2.38125, -1.4375 ), ctlpt( E3, 0, 2.25, -1.5 ), ctlpt( E3, 0, 1.725, -1.75 ), ctlpt( E3, 0, 1.2, -2 ), ctlpt( E3, 0, 0.75, -2 ), ctlpt( E3, 0, 0.3, -2 ), ctlpt( E3, 0, 0.075, -1.5 ), ctlpt( E3, 0, 0, -1.5 ) ), list( ctlpt( E3, 0.784, 2.25, -1.4 ), ctlpt( E3, 0.749, 2.38125, -1.3375 ), ctlpt( E3, 0.805, 2.38125, -1.4375 ), ctlpt( E3, 0.84, 2.25, -1.5 ), ctlpt( E3, 0.98, 1.725, -1.75 ), ctlpt( E3, 1.12, 1.2, -2 ), ctlpt( E3, 1.12, 0.75, -2 ), ctlpt( E3, 1.12, 0.3, -2 ), ctlpt( E3, 0.84, 0.075, -1.5 ), ctlpt( E3, 0.84, 0, -1.5 ) ), list( ctlpt( E3, 1.4, 2.25, -0.784 ), ctlpt( E3, 1.3375, 2.38125, -0.749 ), ctlpt( E3, 1.4375, 2.38125, -0.805 ), ctlpt( E3, 1.5, 2.25, -0.84 ), ctlpt( E3, 1.75, 1.725, -0.98 ), ctlpt( E3, 2, 1.2, -1.12 ), ctlpt( E3, 2, 0.75, -1.12 ), ctlpt( E3, 2, 0.3, -1.12 ), ctlpt( E3, 1.5, 0.075, -0.84 ), ctlpt( E3, 1.5, 0, -0.84 ) ), list( ctlpt( E3, 1.4, 2.25, 0 ), ctlpt( E3, 1.3375, 2.38125, 0 ), ctlpt( E3, 1.4375, 2.38125, 0 ), ctlpt( E3, 1.5, 2.25, 0 ), ctlpt( E3, 1.75, 1.725, 0 ), ctlpt( E3, 2, 1.2, 0 ), ctlpt( E3, 2, 0.75, 0 ), ctlpt( E3, 2, 0.3, 0 ), ctlpt( E3, 1.5, 0.075, 0 ), ctlpt( E3, 1.5, 0, 0 ) ) ), list( list( 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3 ), list( 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4 ) ) ); Spout = sbspline( 4, 4, list( list( ctlpt( E3, 1.7, 1.275, 0 ), ctlpt( E3, 2.6, 1.275, 0 ), ctlpt( E3, 2.3, 1.95, 0 ), ctlpt( E3, 2.7, 2.25, 0 ), ctlpt( E3, 2.8, 2.325, 0 ), ctlpt( E3, 2.9, 2.325, 0 ), ctlpt( E3, 2.8, 2.25, 0 ) ), list( ctlpt( E3, 1.7, 1.275, 0.66 ), ctlpt( E3, 2.6, 1.275, 0.66 ), ctlpt( E3, 2.3, 1.95, 0.25 ), ctlpt( E3, 2.7, 2.25, 0.25 ), ctlpt( E3, 2.8, 2.325, 0.25 ), ctlpt( E3, 2.9, 2.325, 0.15 ), ctlpt( E3, 2.8, 2.25, 0.15 ) ), list( ctlpt( E3, 1.7, 0.45, 0.66 ), ctlpt( E3, 3.1, 0.675, 0.66 ), ctlpt( E3, 2.4, 1.875, 0.25 ), ctlpt( E3, 3.3, 2.25, 0.25 ), ctlpt( E3, 3.525, 2.34375, 0.25 ), ctlpt( E3, 3.45, 2.3625, 0.15 ), ctlpt( E3, 3.2, 2.25, 0.15 ) ), list( ctlpt( E3, 1.7, 0.45, 0 ), ctlpt( E3, 3.1, 0.675, 0 ), ctlpt( E3, 2.4, 1.875, 0 ), ctlpt( E3, 3.3, 2.25, 0 ), ctlpt( E3, 3.525, 2.34375, 0 ), ctlpt( E3, 3.45, 2.3625, 0 ), ctlpt( E3, 3.2, 2.25, 0 ) ), list( ctlpt( E3, 1.7, 0.45, -0.66 ), ctlpt( E3, 3.1, 0.675, -0.66 ), ctlpt( E3, 2.4, 1.875, -0.25 ), ctlpt( E3, 3.3, 2.25, -0.25 ), ctlpt( E3, 3.525, 2.34375, -0.25 ), ctlpt( E3, 3.45, 2.3625, -0.15 ), ctlpt( E3, 3.2, 2.25, -0.15 ) ), list( ctlpt( E3, 1.7, 1.275, -0.66 ), ctlpt( E3, 2.6, 1.275, -0.66 ), ctlpt( E3, 2.3, 1.95, -0.25 ), ctlpt( E3, 2.7, 2.25, -0.25 ), ctlpt( E3, 2.8, 2.325, -0.25 ), ctlpt( E3, 2.9, 2.325, -0.15 ), ctlpt( E3, 2.8, 2.25, -0.15 ) ), list( ctlpt( E3, 1.7, 1.275, 0 ), ctlpt( E3, 2.6, 1.275, 0 ), ctlpt( E3, 2.3, 1.95, 0 ), ctlpt( E3, 2.7, 2.25, 0 ), ctlpt( E3, 2.8, 2.325, 0 ), ctlpt( E3, 2.9, 2.325, 0 ), ctlpt( E3, 2.8, 2.25, 0 ) ) ), list( list( 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 2 ), list( 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 2 ) ) ); Handle = sbspline( 4, 4, list( list( ctlpt( E3, -1.595, 1.875, 0 ), ctlpt( E3, -2.295, 1.875, 0 ), ctlpt( E3, -2.695, 1.875, 0 ), ctlpt( E3, -2.695, 1.65, 0 ), ctlpt( E3, -2.695, 1.425, 0 ), ctlpt( E3, -2.495, 0.975, 0 ), ctlpt( E3, -1.995, 0.75, 0 ) ), list( ctlpt( E3, -1.595, 1.875, 0.3 ), ctlpt( E3, -2.295, 1.875, 0.3 ), ctlpt( E3, -2.695, 1.875, 0.3 ), ctlpt( E3, -2.695, 1.65, 0.3 ), ctlpt( E3, -2.695, 1.425, 0.3 ), ctlpt( E3, -2.495, 0.975, 0.3 ), ctlpt( E3, -1.995, 0.75, 0.3 ) ), list( ctlpt( E3, -1.495, 2.1, 0.3 ), ctlpt( E3, -2.495, 2.1, 0.3 ), ctlpt( E3, -2.995, 2.1, 0.3 ), ctlpt( E3, -2.995, 1.65, 0.3 ), ctlpt( E3, -2.995, 1.2, 0.3 ), ctlpt( E3, -2.645, 0.7875, 0.3 ), ctlpt( E3, -1.895, 0.45, 0.3 ) ), list( ctlpt( E3, -1.495, 2.1, 0 ), ctlpt( E3, -2.495, 2.1, 0 ), ctlpt( E3, -2.995, 2.1, 0 ), ctlpt( E3, -2.995, 1.65, 0 ), ctlpt( E3, -2.995, 1.2, 0 ), ctlpt( E3, -2.645, 0.7875, 0 ), ctlpt( E3, -1.895, 0.45, 0 ) ), list( ctlpt( E3, -1.495, 2.1, -0.3 ), ctlpt( E3, -2.495, 2.1, -0.3 ), ctlpt( E3, -2.995, 2.1, -0.3 ), ctlpt( E3, -2.995, 1.65, -0.3 ), ctlpt( E3, -2.995, 1.2, -0.3 ), ctlpt( E3, -2.645, 0.7875, -0.3 ), ctlpt( E3, -1.895, 0.45, -0.3 ) ), list( ctlpt( E3, -1.595, 1.875, -0.3 ), ctlpt( E3, -2.295, 1.875, -0.3 ), ctlpt( E3, -2.695, 1.875, -0.3 ), ctlpt( E3, -2.695, 1.65, -0.3 ), ctlpt( E3, -2.695, 1.425, -0.3 ), ctlpt( E3, -2.495, 0.975, -0.3 ), ctlpt( E3, -1.995, 0.75, -0.3 ) ), list( ctlpt( E3, -1.595, 1.875, 0 ), ctlpt( E3, -2.295, 1.875, 0 ), ctlpt( E3, -2.695, 1.875, 0 ), ctlpt( E3, -2.695, 1.65, 0 ), ctlpt( E3, -2.695, 1.425, 0 ), ctlpt( E3, -2.495, 0.975, 0 ), ctlpt( E3, -1.995, 0.75, 0 ) ) ), list( list( 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 2 ), list( 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 2 ) ) ); Cap = sbspline( 4, 4, list( list( ctlpt( E3, 0, 3, 0 ), ctlpt( E3, 0.8, 3, 0 ), ctlpt( E3, 0, 2.7, 0 ), ctlpt( E3, 0.2, 2.55, 0 ), ctlpt( E3, 0.4, 2.4, 0 ), ctlpt( E3, 1.3, 2.4, 0 ), ctlpt( E3, 1.3, 2.25, 0 ) ), list( ctlpt( E3, 0, 3, 0.002 ), ctlpt( E3, 0.8, 3, 0.45 ), ctlpt( E3, 0, 2.7, 0 ), ctlpt( E3, 0.2, 2.55, 0.112 ), ctlpt( E3, 0.4, 2.4, 0.224 ), ctlpt( E3, 1.3, 2.4, 0.728 ), ctlpt( E3, 1.3, 2.25, 0.728 ) ), list( ctlpt( E3, 0.002, 3, 0 ), ctlpt( E3, 0.45, 3, 0.8 ), ctlpt( E3, 0, 2.7, 0 ), ctlpt( E3, 0.112, 2.55, 0.2 ), ctlpt( E3, 0.224, 2.4, 0.4 ), ctlpt( E3, 0.728, 2.4, 1.3 ), ctlpt( E3, 0.728, 2.25, 1.3 ) ), list( ctlpt( E3, 0, 3, 0 ), ctlpt( E3, 0, 3, 0.8 ), ctlpt( E3, 0, 2.7, 0 ), ctlpt( E3, 0, 2.55, 0.2 ), ctlpt( E3, 0, 2.4, 0.4 ), ctlpt( E3, 0, 2.4, 1.3 ), ctlpt( E3, 0, 2.25, 1.3 ) ), list( ctlpt( E3, -0.002, 3, 0 ), ctlpt( E3, -0.45, 3, 0.8 ), ctlpt( E3, 0, 2.7, 0 ), ctlpt( E3, -0.112, 2.55, 0.2 ), ctlpt( E3, -0.224, 2.4, 0.4 ), ctlpt( E3, -0.728, 2.4, 1.3 ), ctlpt( E3, -0.728, 2.25, 1.3 ) ), list( ctlpt( E3, 0, 3, 0.002 ), ctlpt( E3, -0.8, 3, 0.45 ), ctlpt( E3, 0, 2.7, 0 ), ctlpt( E3, -0.2, 2.55, 0.112 ), ctlpt( E3, -0.4, 2.4, 0.224 ), ctlpt( E3, -1.3, 2.4, 0.728 ), ctlpt( E3, -1.3, 2.25, 0.728 ) ), list( ctlpt( E3, 0, 3, 0 ), ctlpt( E3, -0.8, 3, 0 ), ctlpt( E3, 0, 2.7, 0 ), ctlpt( E3, -0.2, 2.55, 0 ), ctlpt( E3, -0.4, 2.4, 0 ), ctlpt( E3, -1.3, 2.4, 0 ), ctlpt( E3, -1.3, 2.25, 0 ) ), list( ctlpt( E3, 0, 3, -0.002 ), ctlpt( E3, -0.8, 3, -0.45 ), ctlpt( E3, 0, 2.7, 0 ), ctlpt( E3, -0.2, 2.55, -0.112 ), ctlpt( E3, -0.4, 2.4, -0.224 ), ctlpt( E3, -1.3, 2.4, -0.728 ), ctlpt( E3, -1.3, 2.25, -0.728 ) ), list( ctlpt( E3, -0.002, 3, 0 ), ctlpt( E3, -0.45, 3, -0.8 ), ctlpt( E3, 0, 2.7, 0 ), ctlpt( E3, -0.112, 2.55, -0.2 ), ctlpt( E3, -0.224, 2.4, -0.4 ), ctlpt( E3, -0.728, 2.4, -1.3 ), ctlpt( E3, -0.728, 2.25, -1.3 ) ), list( ctlpt( E3, 0, 3, 0 ), ctlpt( E3, 0, 3, -0.8 ), ctlpt( E3, 0, 2.7, 0 ), ctlpt( E3, 0, 2.55, -0.2 ), ctlpt( E3, 0, 2.4, -0.4 ), ctlpt( E3, 0, 2.4, -1.3 ), ctlpt( E3, 0, 2.25, -1.3 ) ), list( ctlpt( E3, 0.002, 3, 0 ), ctlpt( E3, 0.45, 3, -0.8 ), ctlpt( E3, 0, 2.7, 0 ), ctlpt( E3, 0.112, 2.55, -0.2 ), ctlpt( E3, 0.224, 2.4, -0.4 ), ctlpt( E3, 0.728, 2.4, -1.3 ), ctlpt( E3, 0.728, 2.25, -1.3 ) ), list( ctlpt( E3, 0, 3, -0.002 ), ctlpt( E3, 0.8, 3, -0.45 ), ctlpt( E3, 0, 2.7, 0 ), ctlpt( E3, 0.2, 2.55, -0.112 ), ctlpt( E3, 0.4, 2.4, -0.224 ), ctlpt( E3, 1.3, 2.4, -0.728 ), ctlpt( E3, 1.3, 2.25, -0.728 ) ), list( ctlpt( E3, 0, 3, 0 ), ctlpt( E3, 0.8, 3, 0 ), ctlpt( E3, 0, 2.7, 0 ), ctlpt( E3, 0.2, 2.55, 0 ), ctlpt( E3, 0.4, 2.4, 0 ), ctlpt( E3, 1.3, 2.4, 0 ), ctlpt( E3, 1.3, 2.25, 0 ) ) ), list( list( 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 2 ), list( 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4 ) ) ); Cap = sreparam( sregion( Cap, col, 0.0005, 2 ), col, 0, 2 ); EchoSrc = iritState("EchoSource", EchoSrc); free( EchoSrc ); color( Body, red ); color( Cap, green ); color( Spout, blue ); color( handle, magenta ); view_mat = scale( vector( 0.3, 0.3, 0.3 ) ); Teapot = list( Body, Spout, Handle, Cap ); #interact( list( view_mat, Teapot ) ); save( "teapot", Teapot ); Tea1 = instance( "Teapot", tx( 7 ) ); Tea2 = instance( "Teapot", tx( 7 ) * tz( 5 ) ); Tea3 = instance( "Teapot", tz( 5 ) ); view_mat = scale( vector( 0.15, 0.15, 0.15 ) ) * rx( 50 ) * ry( 40 ) * tx( -0.7 ) * ty( 0.2 ); interact( list( view_mat, Teapot, Tea1, Tea2, Tea3 ) ); free( Tea1 ); free( Tea2 ); free( Tea3 ); # # Extract Isocurves from the teapot surfaces. # # # Body # tmp = csurface( Body, COL, 0.0 ); color( tmp, yellow ); bodyIso = list( tmp ); for ( t = 0.3, 0.3, 3.01, tmp = csurface( Body, COL, t ): color( tmp, yellow ): snoc( tmp, bodyIso ) ); for ( t = 0.3, 0.3, 3.91, tmp = csurface( Body, ROW, t ): color( tmp, yellow ): snoc( tmp, bodyIso ) ); # # Spout # tmp = csurface( Spout, COL, 0.0 ); color( tmp, yellow ); spoutIso = list( tmp ); for ( t = 0.2, 0.2, 2.01, tmp = csurface( Spout, COL, t ): color( tmp, yellow ): snoc( tmp, spoutIso ) ); for ( t = 0.25, 0.25, 2.01, tmp = csurface( Spout, ROW, t ): color( tmp, yellow ): snoc( tmp, spoutIso ) ); # # Handle # tmp = csurface( Handle, COL, 0.0 ); color( tmp, yellow ); handleIso = list( tmp ); for ( t = 0.2, 0.2, 2.01, tmp = csurface( Handle, COL, t ): color( tmp, yellow ): snoc( tmp, handleIso ) ); for ( t = 0.4, 0.4, 2.01, tmp = csurface( Handle, ROW, t ): color( tmp, yellow ): snoc( tmp, handleIso ) ); # # Cap # tmp = csurface( Cap, COL, 0.0 ); color( tmp, yellow ); capIso = list( tmp ); for ( t = 0.25, 0.25, 2.01, tmp = csurface( Cap, COL, t ): color( tmp, yellow ): snoc( tmp, capIso ) ); for ( t = 0.4, 0.4, 4.01, tmp = csurface( Cap, ROW, t ): color( tmp, yellow ): snoc( tmp, capIso ) ); teapotIso = list( bodyIso, spoutIso, handleIso, capIso ); view_mat = scale( vector( 0.3, 0.3, 0.3 ) ) * rx( 50 ) * ry( 40 ); interact( list( view_mat, teapotIso ) ); save( "teapot-iso", teapotIso ); view_mat = save_mat; free( Body ); free( Spout ); free( Handle ); free( Cap ); free( Teapot ); free( tmp ); free( t ); free( bodyIso ); free( spoutIso ); free( handleIso ); free( capIso ); free( teapotIso );