/* SCCS @(#)NslStringCanvas.java 1.10---09/01/99--00:15:47 */ // 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. 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 NslStringCanvas extends NslCanvas { private Vector2 priv=new Vector2(); public NslStringCanvas() { super(); } public NslStringCanvas(NslFrame nslDisplayFrame,NslCanvas pre) { super(); set_min_max(pre.getC_min_y(),pre.getC_max_y()); } public NslStringCanvas(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 NslStringCanvas(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); g.drawRect(1, 1, b.width-4, b.height-4); if (b.width= 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