/* SCCS - @(#)NslDisplayXYImageCanvas.java 1.2 - 10/20/98 - 11:00:42 */ //-------------------------------------- // $Log: NslDisplayXYImageCanvas.java,v $ // // Revision 1.1 1997/11/06 03:19:18 erhan // NSL3.0.b // // Revision 1.4 1997/05/09 22:30:23 danjie // add some comments and Log // //-------------------------------------- /* *Copyright(c)1997 USC Brain Project. email nsl@java.usc.edu */ 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 NslDisplayXYImageCanvas extends NslDisplayCanvas { private Vector2 priv=new Vector2(); public NslDisplayXYImageCanvas() { super(); xdata = new float[100]; ydata = new float[100]; // dummyv = -1; } public NslDisplayXYImageCanvas(NslDisplayCanvas pre) { super(); xdata = new float[100]; ydata = new float[100]; // dummyv = -1; set_min_max(pre.getC_min_y(),pre.getC_max_y()); } public NslDisplayXYImageCanvas(String full_name, NslDisplayVariableInfo data_info) { super(full_name, data_info); last_data_pos = ((NslDisplayVariable)variable_list.elementAt(0)).last_data_pos; data = ((NslDisplayVariable)variable_list.elementAt(0)).data; xdata = new float[100]; ydata = new float[100]; } public NslDisplayXYImageCanvas(String full_name, NslDisplayVariableInfo data_info,double dmax, double dmin) { super(full_name, data_info); last_data_pos = ((NslDisplayVariable)variable_list.elementAt(0)).last_data_pos; data = ((NslDisplayVariable)variable_list.elementAt(0)).data; draw_time = 0; y_max =(float) dmax; y_min =(float) dmin; } public void init() { Graphics g = getGraphics(); Rectangle b = getBounds(); g.clearRect(0, 0, b.width, b.height); // last_data_pos = ((NslDisplayVariable)variable_list.elementAt(0)).last_data_pos; // data = ((NslDisplayVariable)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(); System.out.println("HEY! "+ 0); //double [][]xplot = ((NslNumeric2)Xvariable.elementAt(0)).getdouble2(); //double [][]yplot = ((NslNumeric2)Xvariable.elementAt(0)).getdouble2(); double xprevious, yprevious; xprevious = 0; yprevious = 0; //data = ((NslDisplayVariable)variable_list.elementAt(0)).data; System.out.println("HEY!"); g.setColor(Color.black); //draw variable //NslDisplayVariable v = (NslDisplayVariable)variable_list.elementAt(0); //x_dimension = v.x_dimension; //y_dimension = v.y_dimension; last_data_pos = ((NslDisplayVariable)variable_list.elementAt(0)).last_data_pos; System.out.println("HEY! "+last_data_pos); //data = ((NslDisplayVariable)variable_list.elementAt(0)).data; for( draw_time = 0; draw_time<=last_data_pos; draw_time++){ Xvariable = frame.get_var_sel_info( xname ); Yvariable = frame.get_var_sel_info( yname ); // Vector temp1 = Xvariable.elementAt(0); //System.out.println("Drawing "+xy[0]+" "+xy[1]+" "+xy[2]+" "+xy[3] +"\n"+ Xvariable+ "\n"+ Yvariable); // tempo = (double) Xvariable.elementAt( (int) (xy[0] * y_dimension + xy[2])); //System.out.println("Hello 0 "+xdata[last_data_pos]+" "+ydata[last_data_pos]); //tempox = ((NslDisplayVariable)Xvariable.elementAt(0)).data; //System.out.println("Hello 0 ---\n"+ (NslNumeric2)Xvariable.elementAt(0) ); double [][]xplot = ((NslNumeric2)Xvariable.elementAt(0)).getdouble2(); double [][]yplot = ((NslNumeric2)Xvariable.elementAt(0)).getdouble2(); double [][]xplot2 = ((NslNumeric2)Xvariable.elementAt(0)).getdouble2(); double [][]yplot2 = ((NslNumeric2)Yvariable.elementAt(0)).getdouble2(); xdata[last_data_pos] = (float)xplot[(int)xy[0]][(int)xy[1]]; ydata[last_data_pos] = (float)yplot[(int)xy[2]][(int)xy[3]]; System.out.println("YEP!!!" +xplot2[(int)xy[0]][(int)xy[1]]+" "+yplot2[(int)xy[2]][(int)xy[3]]); //System.out.println("Hello 1 "+ temp1 ); //tempoy = ((NslDisplayVariable)Yvariable.elementAt(0)).data; //System.out.println(" "); //System.out.println("Hello 1 "+ Xvariable.elementAt(1)); //System.out.println(" "); //System.out.println("Hello 2 "+ Xvariable.elementAt(2)); //System.out.println(" "); int x_dimension,y_dimension, sim_time; x_dimension =((Integer)Xvariable.elementAt(1)).intValue(); y_dimension =((Integer)Xvariable.elementAt(2)).intValue(); System.out.println("YEP!!!" +xplot[(int)xy[0]][(int)xy[1]]+" "+yplot[(int)xy[2]][(int)xy[3]]); System.out.println("YEP!!!" +xplot2[(int)xy[0]][(int)xy[1]]+" "+yplot2[(int)xy[2]][(int)xy[3]]); xprevious = xplot[ (int)xy[0] ][ (int)xy[1] ]; yprevious = xplot[ (int)xy[2] ][ (int)xy[3] ]; g.setPaintMode(); } if (last_data_pos > 0) for( draw_time = 1; draw_time<=last_data_pos; draw_time++){ g.setColor(Color.black); System.out.println("WE HAVE X "+ ((NslNumeric2)Xvariable.elementAt(0)).getName()+" Y "+((NslNumeric2)Yvariable.elementAt(0)).getName() ); g.drawLine((int)(drawX+xdata[draw_time-1] ), (int)(drawY+dx*v.info.getDimension(1) - ydata[draw_time-1]), (int)(drawX+xdata[draw_time] ), (int)(drawY+dx*v.info.getDimension(1) - ydata[draw_time])); /* g.drawLine((int)(drawX+xdata[draw_time-1] ), (int)(drawY+dy*v.getDimension(0) - ydata[draw_time-1] ), (int)(drawX+xdata[draw_time] ), (int)(drawY+dy*v.getDimension(0) - ydata[draw_time] )); */ System.out.println("time "+draw_time+" " + (drawX+xdata[draw_time-1])+" "+ (drawY+dx*v.info.getDimension(1) - ydata[draw_time-1])+" to "+ (drawX+xdata[draw_time])+" "+ (drawY+dx*v.info.getDimension(1) -ydata[draw_time]) +"( "+ drawX+" "+drawY+" "+(drawX+dx*v.info.getDimension(1))+" "+ (drawY+dy*v.info.getDimension(0))+")"); g.setPaintMode(); } super.paint(g, 99); } public void paint(Graphics g) { draw_time =last_data_pos; 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, PrintWriter pw) /* *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"); for (ii=0;ii