media @ VU
[] readme course(s) preface I 1 2 II 3 4 III 5 6 7 IV 8 9 10 V 11 12 afterthought(s) appendix reference(s) example(s) resource(s) _

talk show tell print

applet-math-lagrange.jva

applet-math-lagrange.jva / applet-math-lagrange


  // Interactive 2D Lagrange splines,  Evgeny Demidov 22 June 2001
  import java.awt.*;
  import java.awt.event.*;
  import java.util.StringTokenizer;
  
  public class applet-math-lagrange extends java.applet.Applet
    implements MouseMotionListener{
  Image buffImage;          Graphics buffGraphics;
  int n = 4, n1,  w,h,h1,w2;
  double[] Px,Py, ti;
  double bF[][];
  
  public void drawFun(){
    double step = 1./(w2-1), t = 0,  min = 0, max = 0;
    Color[] iColor = {Color.red, new Color(0f,.7f,0f), Color.blue, Color.magenta,
     new Color(0f,.8f,.8f), new Color(.9f,.9f,0f), Color.gray };
    buffGraphics.clearRect(0,0, w, h);
  
    for (int k = 0; k < w2; k++){        //  basis functions calculation
     for (int j = 0; j < n; j++){
      double P = 1;
      for (int i = 0; i < n; i++)
       if (i != j) P = P*(t-ti[i])/(ti[j] - ti[i]);
  
      if (P > max) max = P;
      if (P < min) min = P;
      bF[j][k] = P;}
     t += step;}
  //  System.out.println("test");
    double M = h1/(max-min);
    for (int j = 0; j < n; j++){
     buffGraphics.setColor(iColor[j % 7]);
     for (int k = 1; k < w2; k++)
      buffGraphics.drawLine(w2+k-1, h1-(int)(M*(bF[j][k-1]-min)),
       w2+k, h1-(int)(M*(bF[j][k]-min)) );}
    int y0 = h1+(int)(M*min);
    buffGraphics.setColor(Color.black);
    buffGraphics.drawLine(w2,y0, w-1,y0);
    for (int i = 0; i < n; i++)
     buffGraphics.drawRect(w2+(int)(w2*ti[i])-1, y0-1, 3,3);
  }
  
  public void init() {
    w = Integer.parseInt(getParameter("width"));
    h = Integer.parseInt(getParameter("height"));  h1 = h-1; w2 = w/2;
    String s = getParameter("N"); if (s != null) n = Integer.parseInt(s);
    n1 = n+1;
    Px = new double[n];  Py = new double[n];  ti = new double[n];
    bF = new double[n][w2];
    s=getParameter("pts");
    if (s != null){
     StringTokenizer st = new StringTokenizer(s);
     for (int i = 0; i < n; i++){
      Px[i] = w2*Double.valueOf(st.nextToken()).doubleValue();
      Py[i] = h1*Double.valueOf(st.nextToken()).doubleValue();
      ti[i] = Double.valueOf(st.nextToken()).doubleValue();}}
    else{
     Px[0] = .1*w2; Px[1] = .1*w2; Px[2] = .9*w2; Px[3] = .9*w2;
     Py[0] = .1*h1; Py[1] = .9*h1; Py[2] = .9*h1; Py[3] = .1*h1;
     ti[0] = 0; ti[1] = .33; ti[2] = .66;  ti[3] = 1;}
    buffImage = createImage(w, h);
    buffGraphics = buffImage.getGraphics();
    setBackground(Color.white);
    buffGraphics.clearRect(0,0, w, h);
    addMouseMotionListener(this);
    drawFun();
    drawSpline();
  }
  
  public void destroy(){ removeMouseMotionListener(this); }
  public void mouseMoved(MouseEvent e){}  //1.1 event handling
  
  public void mouseDragged(MouseEvent e) {
    int y = h1 - e.getY();  if (y < 0) y = 0;  if (y > h1) y = h1;
    int x = e.getX();
     int iMin = 0;
     double Rmin = 1e10, r2,xi,yi;
    if ( x < w2){
     if (x > w2-5) return;
  //   if (x > w2-3) x = w2-3;
     if (x < 0) x = 0;
     for (int i = 0; i < n; i++){
      xi = (x - Px[i]); yi = (y - Py[i]);
      r2 = xi*xi + yi*yi;
      if ( r2 < Rmin ){ iMin = i; Rmin = r2;}}
     Px[iMin] = x; Py[iMin] = y;
    }
    else{
     double t = (double)(x - w2)/w2;
     if ( t > 1 ) t = 1;
     for (int i = 0; i < n; i++)
      if ( (r2 = Math.abs(ti[i]-t) ) < Rmin ){ iMin = i; Rmin = r2;}
     ti[iMin] = t;
     drawFun();
    }
    drawSpline();
    repaint();
  }
  
  public void drawSpline(){
    int X,Y;
    buffGraphics.clearRect(0,0, w2, h);
    buffGraphics.setColor(Color.blue);
    for (int i = 0; i < n; i++){
     X = (int)Px[i];  Y = h1-(int)Py[i];
     buffGraphics.drawRect(X-1,Y-1, 3,3);}
    if ( n > 2 ){
     int Xo = (int)Px[0], Yo = h1-(int)Py[0];
     for (int i = 1; i < n; i++){
      X = (int)Px[i];  Y = h1-(int)Py[i];
      buffGraphics.drawLine(Xo,Yo, X,Y);
      Xo = X;  Yo = Y;}
    }
    buffGraphics.setColor(Color.red);
    double sX = 0, sY = 0;
    for (int j = 0; j < n; j++){
     sX += Px[j]*bF[j][0];  sY += Py[j]*bF[j][0];}
    int Xold = (int)sX, Yold = h1-(int)sY;
    for (int k = 1; k < w2; k++){
     sX = 0;  sY = 0;
     for (int j = 0; j < n; j++){
       sX += Px[j]*bF[j][k];  sY += Py[j]*bF[j][k];}
     X = (int)sX;  Y = h1-(int)sY;
     if ( (X < w2) && (Xold < w2) ) buffGraphics.drawLine(Xold,Yold, X,Y );
     Xold = X; Yold = Y;
    }
  }
  
  public void paint(Graphics g) {
    g.drawImage(buffImage, 0, 0, this);
  //  showStatus( " " + x +"  " + y);
  }
  
  public void update(Graphics g){ paint(g); }
  
  }
  


(C) A. Eliëns 2/9/2007

You may not copy or print any of this material without explicit permission of the author or the publisher.
In case of other copyright issues, contact the author.