Is it possible...

Equinox, http://www.wizards.dupont.com/Equinox/Equinox.html, allows the
user to track a green dot across the surface by manipulating a yellow
dot.  The user clicks on the yellow dot and moves it with the pointer
in 3 dimensions.  The green dot tracks in 2 dimensions and stays just
above the surface (thanks Bull).  I would like to make two changes to
 the current implementation:

  1. the location of the yellow dot appears in the upper left hand
     corner.  I would like the 'documents' variable to reflect the
     position of the green dot, not the yellow dot as it does now (the
     X and Y variables are already the same for the yellow and green
     dot);

  2. I would like to constrain the green dot to remain on the surface.
     I can get close with this code

        RealTuple location=(RealTuple) direct_reference.getData();
        int x=(int) (((Real) location.getComponent(0)).getValue()+0.5);
        int y=(int) (((Real) location.getComponent(1)).getValue()+0.5);
        if ((x >= 0) && (x < table.getColumnCount()) &&
            (y >= 0) && (y < table.getRowCount()))
          {
            /* update green dot */
          }

     But this is not quite what I want.  I still want to move the green
     dot if one of the variables (x,y) is within range but constrain it to
     the surface (0-39,0-29).  Using Math.min and Math.max comes to mind
     but how do you use min and max in this context:

        Real[] pairs={(Real) location.getComponent(0),
          (Real) location.getComponent(1)};
        RealTuple pair=new RealTuple(pairs);
        Real value=(Real) self_organizing_map.evaluate(pair);
        value=(Real) value.add(new Real(1.0));
        Real[] triples={(Real) location.getComponent(0),
          (Real) location.getComponent(1),value};

Is either of these requirements possible with Visad?  If so, please clue
me into solving this problem.  The relavant code follows:

    CellImpl cell=new CellImpl()
    {
      public void doAction() throws VisADException, RemoteException
      {
        /*
          Yellow dot tracks green dot along the surface (thanks to
          whibbard@xxxxxxxxxxxxx).
        */
        RealTuple location=(RealTuple) direct_reference.getData();
        Real[] pairs={(Real) location.getComponent(0),
          (Real) location.getComponent(1)};
        RealTuple pair=new RealTuple(pairs);
        Real value=(Real) self_organizing_map.evaluate(pair);
        value=(Real) value.add(new Real(1.0));
        Real[] triples={(Real) location.getComponent(0),
          (Real) location.getComponent(1),value};
        RealTuple triple=new RealTuple(triples);
        triple_reference.setData(triple);
      }
    };
    cell.addReference(direct_reference);