/* SCCS @(#)NslAreaCanvas.java 1.5---05/15/99--12:25:35 */ // Copyright: Copyright (c) 1997 University of Southern California Brain Project. // Copyright: This software may be freely copied provided the toplevel // Copyright: COPYRIGHT file is included with each such copy. // Copyright: Email nsl@java.usc.edu. //-------------------------------------- // $Log: NslAreaCanvas.java,v $ // // Revision 1.7 1998/01/30 20:02:25 erhan // ver 5 // // Revision 1.4 1997/05/09 22:30:23 danjie // add some comments and Log // //-------------------------------------- package nslj.src.display; import java.awt.*; import java.util.*; import java.io.*; import nslj.src.lang.*; import nslj.src.system.*; import java.lang.Math; public class NslAreaCanvas extends NslCanvas { private Vector2 priv=new Vector2(); public NslAreaCanvas() { super(); } public NslAreaCanvas(NslFrame nslDisplayFrame, NslCanvas pre) { this(nslDisplayFrame,pre.canvas_name, ((NslVariable)pre.variable_list.elementAt(0)).info, pre.getC_min_y(), pre.getC_max_y()); } public NslAreaCanvas(NslFrame nslDisplayFrame, String full_name, NslVariableInfo data_info) { super(nslDisplayFrame, full_name, data_info); last_data_pos = ((NslVariable)variable_list.elementAt(0)).last_data_pos; // data = ((NslVariable)variable_list.elementAt(0)).data; draw_time = 0; } public NslAreaCanvas(NslFrame nslDisplayFrame, String full_name, NslVariableInfo data_info, double dmin, double dmax) { super(nslDisplayFrame,full_name, data_info); last_data_pos = ((NslVariable)variable_list.elementAt(0)).last_data_pos; // data = ((NslVariable)variable_list.elementAt(0)).data; draw_time = 0; set_min_max(dmin,dmax); } public void set_min_max(double dmin,double dmax) { y_max =(float) dmax; y_min =(float) dmin; C_max_y = dmax; C_min_y = dmin; } public void init() { Graphics g = getGraphics(); Rectangle b = getBounds(); g.clearRect(0, 0, b.width, b.height); // last_data_pos = ((NslVariable)variable_list.elementAt(0)).last_data_pos; // data = ((NslVariable)variable_list.elementAt(0)).data; paint(g); // draw_time = -1; } public void update() { Graphics g2 = getGraphics(); draw_time = 0; update(g2); } public void repaint() { Graphics g2 = getGraphics(); draw_time =0; paint(g2); } public void paint_partial(Graphics g) { if(canvas_type.equals("Normal")) super.set_draw_size(); else if(canvas_type.equals("Zoom")) super.zoom_draw_size(); g.setColor(Color.black); //draw variable NslVariable v = (NslVariable)variable_list.elementAt(0); x_dimension = v.info.getDimension(0); y_dimension = v.info.getDimension(1); last_data_pos = ((NslVariable)variable_list.elementAt(0)).last_data_pos; data = ((NslVariable)variable_list.elementAt(0)).data; if ((NslSystem.init_run_char == 'B')|| (NslSystem.init_run_char == 'D')){ //before or during //System.out.println("debug: NslAreaCanvas bad flag "+ NslSystem.init_run_char); //NslSystem.init_run_char = 'B'; last_data_pos = 0; } draw_time = last_data_pos; NslStoringVariables Bez = new NslStoringVariables(); // for( ; draw_time<=last_data_pos; draw_time++){ //System.out.println("\n\n\nDRAWTIME = "+draw_time ); /* // if (draw_time > 0 && (draw_time % 30 == 0)) //fitting_main(draw_time); // just for testing purposes // Bez.fitting_main(draw_time); // just for testing purposes */ for(int i=0; i= y_max) { data_x_size = dx; data_y_size = dy; } else if(data[i][j][draw_time] <= y_min) { data_x_size = dx; //(int)y_min; data_y_size = dy; //(int)y_min; } else { // data_x_size = (int)(dx * (Math.abs(data[i][j][draw_time] - y_min) / (y_max - y_min))); // data_y_size = (int)(dy * (Math.abs(data[i][j][draw_time] - y_min) / (y_max - y_min))); double scale=0; if (data[i][j][draw_time]>=0) scale = data[i][j][draw_time]/y_max; else scale = data[i][j][draw_time]/y_min; data_x_size = (int)(dx*scale); data_y_size = (int)(dy*scale); } boxColor = ((NslVariable) variable_list.elementAt(v_count)).info.getColor(); g.setColor(boxColor); //ERH g.setXORMode(getBackground()); // For overlaying the multiple box if (data[i][j][draw_time] == 0) { g.fillRect(drawX+j*dx+ dx/2, drawY+i*dy+ dy/2, 1, 1); } else if (data[i][j][draw_time] > 0) { //System.out.println("Filling rectangle " + data_x_size+" "+data[i][j][draw_time]); g.fillRect(drawX+j*dx+ (dx-data_x_size)/2, drawY+i*dy+ (dy-data_y_size)/2, data_x_size, data_y_size); } else { //System.out.println(" Drawing rectangle " + data_x_size+" "+data[i][j][draw_time]); g.drawRect(drawX+j*dx+ (dx-data_x_size)/2+1, drawY+i*dy+ (dy-data_y_size)/2+1, data_x_size-2,data_y_size-2); } g.setPaintMode(); } } //} super.paint(g, 1); } public void paint(Graphics g) { draw_time =last_data_pos; //System.out.println("THE SIZE IS "+variable_list.size()+"\n\n\n\n\n\n\n\n\n"); paint_partial(g); } public void collect() { for(int i=0; i= maxDist) { maxDist = dist; /* *splitPoint = i; */ splitPoint[0] = i; } } //System.out.println("EXITING MAX ERROR"+splitPoint[0]); //System.out.println("splitPoint "+splitPoint[0]+" and maxDist "+maxDist); return (maxDist); } /* * Reparameterize: * Given set of points and their parameterization, try to find * a better parameterization. * */ public double [] Reparameterize(Vector2 [] d, int first, int last, double [] u, Vector2 [] bezCurve) /* d; Array of digitized points */ /* first, last; Indices defining region */ /* u; Current parameter values */ /* bezCurve; Current fitted curve */ { int nPts = last-first+1; int i; double [] uPrime = new double [nPts]; /* New parameter values */ /* uPrime = (double *)malloc(nPts * sizeof(double)); */ for (i = first; i <= last; i++) { uPrime[i-first] = NewtonRaphsonRootFind(bezCurve, d[i], u[i-first]); // System.out.print(" "+uPrime[i-first]); } //System.out.println(); return (uPrime); } /* * NewtonRaphsonRootFind : * Use Newton-Raphson iteration to find better root. */ public double NewtonRaphsonRootFind(Vector2 [] Q, Vector2 P, double u) /* Q; Current fitted curve */ /* P; Digitized point */ /* u; Parameter value for "P" */ { double numerator, denominator; Vector2 [] Q1 = new Vector2[3]; Vector2 [] Q2= new Vector2[2]; /* Q' and Q'' */ Vector2 Q_u, Q1_u, Q2_u; /*u evaluated at Q, Q', & Q'' */ double uPrime; /* Improved u */ int i; /* Compute Q(u) */ Q_u = BezierII(3, Q, u); /* Generate control vertices for Q' */ for (i = 0; i <= 2; i++) { double x1 = Q[i+1].xval() - Q[i].xval(); double y1 = Q[i+1].yval() - Q[i].yval(); Q1[i] = new Vector2(); Q1[i].xset (x1 * 3.0); Q1[i].yset (y1 * 3.0); } /* Generate control vertices for Q'' */ for (i = 0; i <= 1; i++) { double x1 = Q[i+1].xval() - Q[i].xval(); double y1 = Q[i+1].yval() - Q[i].yval(); Q2[i] = new Vector2(); Q2[i].xset ( x1 * 2.0); Q2[i].yset ( y1 * 2.0); } /* Compute Q'(u) and Q''(u) */ Q1_u = BezierII(2, Q1, u); Q2_u = BezierII(1, Q2, u); /* Compute f(u)/f'(u) */ numerator = (Q_u.xval() - P.xval()) * (Q1_u.xval()) + (Q_u.yval() - P.yval()) * (Q1_u.yval()); denominator = (Q1_u.xval()) * (Q1_u.xval()) + (Q1_u.yval()) * (Q1_u.yval()) + (Q_u.xval() - P.xval()) * (Q2_u.xval()) + (Q_u.yval() - P.yval()) * (Q2_u.yval()); /* u = u - f(u)/f'(u) */ uPrime = u - (numerator/denominator); return (uPrime); } /* * FitCurve : * Fit a Bezier curve to a set of digitized points */ //void FitCurve(Vector2 []d, int nPts, double error, PrintStream ps, int i1, int j1) void FitCurve(Vector2 []d, int nPts, double error, PrintStream ps) /* *d; Array of digitized points */ /* nPts; Number of digitized points */ /* error; User-defined error squared */ /* FILE *fp; */ { Vector2 tHat1, tHat2; /* Unit tangent vectors at endpoints */ int ii, jj; //System.out.println("FITTING A CURVE!!!\n\n\n\n"); //System.out.println("THE SIZE IS "+variable_list.size()+"\n\n\n\n\n\n\n\n\n"); /* for (ii=0;ii