//Damping Osillation Attractor //@auther SO byon chol //@version: 28 Jan 1999 import java.awt.*; public class DampRKC extends Canvas{ private static Graphics gg ; //--variable from Damp.class------------- private double maxT, dt, tt, r, w0 ; private int drawFlag = 0 , clearFlag , drawVectFlag = 0 ; private Color lineColor ; //--Canvas dimension--------------------- private int width , height ; private int ox, oy, xLen, yLen, ox1 ; // ox1 : for x-v graph private double maxX, maxV ; private double kakudaiT, kakudaiX, kakudaiV ; //拡大率 private String stX, stV ; private int t1, t2, x1, x2, X1, X2, V1, V2 ; private int arrow_size = 10 ; //--- DampRKC -------------------------- DampRKC(){ gg = getGraphics() ; width = 750 ; height =350 ; ox=30 ; oy=170 ; ox1=580 ; xLen=350 ; yLen=150 ; clearFlag = 1 ; gg = getGraphics(); } //--- public void setVectFlag( int j ){ drawVectFlag = j ; } //--- public void setDrawFlag( int f ){ drawFlag = f ; } //-- set ---------------------------------------------------------- public void set( double maxT, double dt, double maxX, double maxV, double r, double w0 ) { this.maxT = maxT ; this.dt = dt ; this.maxX = maxX ; this.maxV= maxV; this.r = r ; this.w0 = w0 ; kakudaiT = 1.0d*xLen/maxT ; kakudaiX = 1.0d*yLen/maxX ; kakudaiV = 1.0d*yLen/maxV ; } //--- setLineColor--------------- public void setLineColor( Color c ){ this.lineColor = c ; } //--- set_r--------------- public void set_r( double r ){ this.r = r ; } //-- clear -------------------------------------- public void clear(){ this.clearFlag = 1; gg = getGraphics(); paint( gg ) ; } //--- drawOrbit --------------------------------- public void drawOrbit( double x , double v , double xx , double vv, double tt ){ drawFlag = 1 ; this.tt = tt ; x1 = (int) ( oy - kakudaiX*x ) ; x2 = (int) ( oy - kakudaiX*xx) ; X1 = (int) ( ox1 + kakudaiX*x ) ; X2 = (int) ( ox1 + kakudaiX*xx) ; V1 = (int) ( oy - kakudaiV*v ) ; V2 = (int) ( oy - kakudaiV*vv) ; t1 = (int)( ox + kakudaiT*tt ) ; t2 = (int)( ox + kakudaiT*(tt+dt) ) ; gg = getGraphics(); paint( gg ); } //-- paint -------------------------------------- public void paint( Graphics g ){ if( drawFlag == 1 ){ g.setColor( lineColor ) ; g.drawLine( t1, x1, t2, x2 ) ; // x-t graph g.drawLine( X1, V1, X2, V2 ) ; // x-v graph g.setColor( getBackground() ); g.fillRect( ox+xLen+5, 0 , 50 , 20 ); g.setColor( Color.black ); g.drawString( ("t="+(tt+dt)+" ").substring( 0, 7 ) , ox+xLen+5, 17); } if( clearFlag == 1 ){ g.setColor( getBackground() ); g.fillRect(0, 0, width, height ); drawGrid( g ) ; drawVectorField( g ) ; clearFlag = 0 ; } if( drawVectFlag == 1 ){ drawVectorField( g ) ; drawVectFlag = 0 ; } }// paint //--- drawVectorField ----------------------------------- public void drawVectorField( Graphics g ){ Point p = new Point( 0, 0 ) ; Point q = new Point( 0, 0 ) ; for( int yi = -yLen + yLen/5 ; yi < yLen ; yi += yLen/5 ){ p.y = oy + yi ; for( int xi = -yLen + yLen/5 ; xi < yLen ; xi += yLen/5 ){ p.x = ox1 + xi ; double x = xi*maxX/yLen ; double v = - yi*maxV/yLen ; q.x = p.x + (int) ( arrow_size*fx( x, v ) ) ; q.y = p.y - (int) ( arrow_size*fv( x, v ) ) ; LineArrow( g, p, q ) ; } } } public double fx( double x, double v ){ return ( v ) ; } public double fv( double x , double v ){ return ( -2.0*r*v - w0*w0*x ) ; } //---LineArrow() 線でベクトルを描く------------------------ public void LineArrow( Graphics g , Point p1, Point p2 ){ int X = p2.x - p1.x ; int Y = p2.y - p1.y ; if( !( (X==0)&&(Y==0) ) ){ g.setColor( Color.darkGray ) ; g.drawLine( p1.x , p1.y , p2.x, p2.y ) ; double thita = 0.5 ; double fai = Math.atan2( (double)Y, (double)X ) ; double ax = Math.rint( p2.x - 6*Math.cos( fai + thita ) ) ; double ay = Math.rint( p2.y - 6*Math.sin( fai + thita ) ) ; g.drawLine( p2.x, p2.y, (int)ax, (int)ay ) ; double bx = Math.rint( p2.x - 6*Math.cos( fai - thita ) ) ; double by = Math.rint( p2.y - 6*Math.sin( fai - thita ) ) ; g.drawLine( p2.x, p2.y, (int)bx, (int)by ) ; } } //--drawGrid----------------------------------- public void drawGrid( Graphics g ){ g.setColor( Color.white ) ; //x-t garph g.drawRect( ox , oy-yLen , xLen , 2*yLen ) ; //横線 for( int yi = yLen/5 ; yi < yLen ; yi += yLen/5 ){ g.drawLine( ox , oy - yi , ox+xLen, oy - yi ); g.drawLine( ox , oy + yi , ox+xLen, oy + yi ); } //縦線 for( int xi = xLen/10 ; xi < xLen ; xi += xLen/10 ){ g.drawLine( ox + xi , oy - yLen , ox + xi , oy + yLen ) ; } //x-v space g.drawRect( ox1-yLen, oy - yLen , 2*yLen , 2*yLen ) ; //横線 for( int yi = yLen/5 ; yi < yLen ; yi += yLen/5 ){ g.drawLine( ox1-yLen , oy - yi , ox1+yLen, oy - yi ); g.drawLine( ox1-yLen , oy + yi , ox1+yLen, oy + yi ); } //縦線 for( int xi = yLen/5 ; xi < yLen ; xi += yLen/5 ){ g.drawLine( ox1 + xi , oy - yLen , ox1 + xi , oy + yLen ) ; g.drawLine( ox1 - xi , oy - yLen , ox1 - xi , oy + yLen ) ; } g.setColor( Color.black ) ; // axises of x-t graph g.drawLine(ox, oy, ox+xLen, oy) ; // x-axis g.drawString("t", ox+xLen+3, oy+2); g.drawString(""+maxT, ox+xLen-10, oy+15);// g.drawLine(ox, oy+yLen, ox, oy - yLen); // y-axis g.drawString("x", ox-2, 17); g.drawString(""+maxX, ox-20, 25); g.drawString("0", ox-10, oy+3); // x-v phase space g.drawLine(ox1-yLen, oy, ox1+yLen, oy); // x-axis g.drawString("x", ox1+yLen-10, oy+15); g.drawString(""+maxX, ox1+yLen-5, oy-3); g.drawLine(ox1, oy+yLen, ox1, oy-yLen); // y-axis g.drawString("v", ox1-2, 15); g.drawString(""+maxV, ox1-20, 25); }// end of grid //------------ public static String fnx( double x, int n){ String str = x + " " ; str = str.substring( 0, n ) ; return str; } //-- update ------------------------------------- public void update( Graphics g ){ paint( g ) ; } }