import java.awt.*; //import java.applet.Applet; class shellPanel extends Panel { Raup applet; int startAng = 0; int endAng = 1440; int stepAng = 5; double left = 0.; double top = 0.; double width = 0.; double height = 0.; double scale = 0.; shellPanel ( Raup parent ) { applet = parent; } public boolean mouseDown( Event evt, int x, int y ) // redraw when screen clicked { repaint(); return true; } public void makeRing ( int angle ) // calculates left, top, width, height in shell coords {// int angle // whorl is at angle (in degrees)... double dTheta; // whorl is at angle (in radians)... double b1, b2; // original whorl diameter double a1, a2; // original offset of edge from axis double T1, T2; // original translation double dW, dT, dD; // local versions of shell parameters double alpha; // angle of presentation // set and calc the initial shell conditions // set local parameters dW = applet.dW; dD = applet.dD; dT = applet.dT; // calc initial whorl size, offset b1 = 10.0; a1 = ( b1 * dD ) / ( 1.0 - dD ); T1 = 0.0; // calc trigonmetric values dTheta = ((double) angle) * Math.PI / 180.; // angle to radians alpha = Math.cos ( dTheta ); // calc new whorl size and position b2 = Math.pow ( b1, ( dTheta * Math.log ( dW ) ) / ( 2.0 * Math.PI ) ); a2 = ( b2 * dD ) / ( 1.0 - dD ); if ( ( a1 + b1 ) == ( a2 + b2 ) ) { T2 = T1; } else { T2 = T1 + ( dT * ( a2 + b2 - a1 - b1 ) ); } // calc screen parameters top = T2 - ( b2 / 2.0 ); left = Math.min ( alpha * a2, alpha * ( a2 + b2 ) ); height = b2; width = Math.abs( alpha * b2 ); } public void paint( Graphics g ) { int i; double minX, maxX, minY, maxY; double scaleH; int windBorder = 5; double rangeX, rangeY, midY; int windWidth, windHeight; int windMidW, windMidH; int Yoffset, iMidY; // get plot area windWidth = size().width - 2 * windBorder; windHeight = size().height - 2 * windBorder; windMidW = size().width/2; windMidH = size().height/2; // set up drawing area g.setColor ( Color.white ); g.fillRect( 0, 0, size().width, size().height ); g.setColor ( Color.black ); // determine drawing scale makeRing ( startAng ); minX = left; maxX = left + width; minY = top; maxY = top + height; for ( i = startAng; i <= endAng; i += 90 ) { makeRing ( i ); minX = Math.min ( minX, left ); maxX = Math.max ( maxX, ( left + width ) ); minY = Math.min ( minY, top ); maxY = Math.max ( maxY, ( top + height ) ); } // draw 'shell' // center horizontally in pane rangeX = 2. * Math.max ( Math.abs( maxX ), Math.abs ( minX ) ); // center vertically in pane rangeY = maxY - minY; midY = ( maxY + minY ) / 2.0; // scale image to fit scaleH = ( (double) windWidth ) / rangeX; scale = ( (double) windHeight ) / rangeY; if ( scale > scaleH ) scale = scaleH; // use minimum iMidY = ( int ) ( scale * midY ); // draw rings for ( i = startAng; i <= endAng; i += stepAng ) { makeRing ( i ); // calculates left, top, width, height in shell coords g.drawOval ( windMidW + (int) ( left * scale ), // left ( windMidH - iMidY + (int) ( top * scale ) ), // top (int) ( width * scale ), // width (int) ( height * scale ) ); // height } /* // draw circles for visual fill for ( i = startAng; i <= endAng; i += stepAng ) { makeRing ( i ); // calculates left, top, width, height in shell coords setBackground ( Color.black ); g.fillOval ( windMidW + (int) ( left * scale ), // left ( windMidH - iMidY + (int) ( top * scale ) ), // top (int) ( height * scale ), // width (int) ( height * scale ) ); // height setBackground ( Color.white ); } */ // update the valued in the informational panel applet.setInfoText(); applet.info.update(); } }