/* ------------------------------------------------------------- ColorChart.java: This applet draws a 2D chart of a 6 x 6 x 6 color map. Classes: ColorChart Steve Witham ------------------------ history --------------------------- 1999.08.03: Started. I think it drew one swatch using Graphics.drawPolygon(). That's when I started writing DGeom2D. 1999.09.04: Drawing one swatch using DGeom2D! 55 Java lines. 1999.09.04.2: Works just like the original! 97 Java lines. ----------------------------------------------- Made newSwatch() use template.through( DTransform2D.newScaleRotateXY() ). 93 Java lines. 1999.09.11: Create view in init(), call adjust() in paint(). Call view.dispose() in destroy(). 109 Java lines. ------------------------------------------------------------- */ import java.applet.Applet; import java.util.*; import java.awt.*; import java.lang.Math; public class ColorChart extends Applet { DView2D view; double d; // Sort of the "radius" of the swatches. public void init( ) { d = .08; view = new DView2D( this, DRectangle.newXXYY( -d, 1 + d, 1 + d, -d ), false ); // Notice the y's are swapped compared to the TrueBASIC // "set window," because Java's y goes down not up: // Basic: set window left, right, bottom, top // Java: DRectangle.newXXYY( left, right, top, bottom ) } DPolygon newSwatch( double size, double angle, double x, double y ) { final DPolygon template = new DPolygon( new DPoint2D [] { new DPoint2D( .81, .27 ), new DPoint2D( .81, -.27 ), new DPoint2D( -.81, -.09 ), new DPoint2D( -.81, .09 ) } ); return( template.through( DTransform2D.newScaleRotateXY( size, angle, x, y ) ) ); } public void paint( Graphics givenG ) { view.adjust( ); // The window's size may have changed. view.setRGB( .6, .6, .6 ); DRectangle.newXXYY( 0, 1, 0, 1 ).fillInView( view ); for( int w = 0; w <= 15; w++ ) { double angle = Math.PI * ( w / 15.0 + .25 ); for( int r = (int) Math.max( 0, w - 10 ); r <= (int) Math.min( w, 5 ); r++ ) { int cyan = w - r; for( int g = (int) Math.max( 0, cyan - 5 ); g <= (int) Math.min( cyan, 5 ); g++ ) { int b = cyan - g; double x = ( g * .8 + b * .2 ) / 5; double y = ( r * .7 + b * .3 ) / 5; DPolygon swatch = newSwatch( d, angle, x, y ); view.setRGB( r / 5.0, g / 5.0, b / 5.0 ); swatch.fillInView( view ); /* Now decide what color border to draw: */ if( r == g && g == b ) { // On grey scale: if( g > 2 ) { view.setRGB( .4, .4, .4 ); } else { view.setRGB( .6, .6, .6 ); } } else if ( ( r == 0 || r == 5 ) && ( g == 0 || g == 5 ) && ( b == 0 || b == 5 ) ) { // One of { red, yellow, green, cyan, blue, magenta }: view.setColor( Color.black ); } else { // Draw the border in the fill color. } swatch.drawInView( view ); } } } } public void destroy( ) { view.dispose( ); } } /* The original TrueBASIC program (simplified but still correct): let d = .08 set window -d, 1+d, -d, 1+d option angle degrees call setMacPallette ! same colors as the Netscape pallette ! Grey background (60% white) call setrgb( 3, 3, 3 ) plot area: 0, 0; 0, 1; 1, 1; 1, 0 for w = 0 to 15 let a = 180 * 1/15 * w + 45 let dx = d * .8 * cos(a) let dy = d * .8 * sin(a) let ex = dx / 3 let ey = dy / 3 let fx = ex / 3 let fy = ey / 3 for r = max( 0, w - 10 ) to min( w, 5 ) let cy = w - r for g = max( 0, cy - 5 ) to min( cy, 5 ) let b = cy - g call setrgb( r, g, b ) let x = g/5 * .8 + b/5 * .2 let y = r/5 * .7 + b/5 * .3 plot area: x+dx-ey,y+dy+ex;x+dx+ey,y+dy-ex;x-dx+fy,y-dy-fx;x-dx-fy,y-dy+fx if r=0 or r=5 then let redge = 1 else let redge = 0 if g=0 or g=5 then let gedge = 1 else let gedge = 0 if b=0 or b=5 then let bedge = 1 else let bedge = 0 if r = g and g = b then if g > 2 then call setrgb( 2, 2, 2 ) else call setrgb( 3, 3, 3 ) ! call setrgb( r + 2*sgn(2.5-r), g + 2*sgn(2.5-g), b + 2*sgn(2.5-b) ) let doborder = 1 else if redge + gedge + bedge = 3 then call setrgb( 0, 0, 0 ) let doborder = 1 else let doborder = 0 end if if doborder = 1 then plot x+dx-ey,y+dy+ex; x+dx+ey,y+dy-ex; x-dx+fy,y-dy-fx; plot x-dx-fy,y-dy+fx; x+dx-ey,y+dy+ex end if next g next r next w end sub setrgb( r, g, b ) if r=0 and g=0 and b=0 then set color 255 else set color 36 * (5-r) + 6 * (5-g) + (5-b) end if end sub sub setMacPallette for r = 0 to 5 for g = 0 to 5 for b = 0 to 5 if r=0 and g=0 and b=0 then set color mix(255) r/5, g/5, b/5 else set color mix(36*(5-r)+6*(5-g)+(5-b)) r/5, g/5, b/5 end if next b next g next r end sub */