Mercurial > hg > jslab
diff src/samer/mds/MatrixPointViewer2.java @ 0:bf79fb79ee13
Initial Mercurial check in.
author | samer |
---|---|
date | Tue, 17 Jan 2012 17:50:20 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/samer/mds/MatrixPointViewer2.java Tue Jan 17 17:50:20 2012 +0000 @@ -0,0 +1,113 @@ +package samer.mds; + +import samer.core.*; +import samer.core.types.*; +import samer.core.util.*; +import samer.maths.*; +import samer.tools.*; +import java.util.*; +import java.awt.*; + +public class MatrixPointViewer2 extends samer.core.util.swing.VCanvas implements Task, Observer, Agent +{ + Matrix P; // point positions + Vec x; // point activities + int N; + int k1, k2; + Color[] clut; + VMap xmap, ymap, cmap; + VInteger markerSize; + int[] ix, iy; + + public MatrixPointViewer2(Matrix P, Vec x) { + this.P=P; + this.x=x; + N=P.getRowDimension(); + k1=0; k2=1; + +// ColorRamp cramp=new ColorRamp(256); +// cramp.set(0,Color.black); +// cramp.gradientTo(255,Color.white); + clut=new Color[256]; + for (int i=0; i<256; i++) clut[i]=new Color(255,255,255,i); + + ix = new int[N]; + iy = new int[N]; + + markerSize=new VInteger("markerSize",4); + cmap=new VMap(new LinearMap(256),new Node("cmap")); + xmap=new VMap(new LinearMap(256),new Node("xmap")); + ymap=new VMap(new LinearMap(256),new Node("ymap")); + exposeCommands(this); + + P.viewable().addObserver(this); + xmap.addObserver(this); + ymap.addObserver(this); + } + + public void sized() { + xmap.getMap().setIntRange(width); + ymap.getMap().setIntRange(height); + update(null,null); + } + + public void attach() { P.viewable().addObserver(this); } + public void detach() { + P.viewable().deleteObserver(this); + xmap.dispose(); + ymap.dispose(); + cmap.dispose(); + markerSize.dispose(); + } + + public void rotate() { + k2++; + if (k2>=P.getColumnDimension()) { + k2=0; k1++; + if (k1>=P.getColumnDimension()) k1=0; + } + if (k2==k1) rotate(); + } + + public void starting() {} + public void stopping() {} + public void run() { repaint(); } + public void dispose() { detach(); } + + public void update(Observable o, Object a) + { + double [][] p=P.getArray(); + IMap xm=xmap.getMap(); + IMap ym=ymap.getMap(); + + for (int i=0; i<N; i++) { + double r[]=p[i]; + ix[i]=xm.toInt(r[k1]); + iy[i]=ym.toInt(r[k2]); + } + repaint(); + } + + public void paint(Graphics g) { + double [] a=x.array(); + IMap cm=cmap.getMap(); + int b=markerSize.value; + + clear(g); + for (int i=0; i<N; i++) { + g.setColor(clut[cm.clipInt(a[i])]); + g.fillRect(ix[i],iy[i],b,b); + } + } + + public void getCommands(Registry r) { + r.add("rotate").add("x-map").add("y-map").add("c-map"); + } + public void execute(String cmd, Environment env) + { + if (cmd.equals("rotate")) { rotate(); update(null,null); } + else if (cmd.equals("x-map")) Shell.expose(xmap.getViewer(),"x-map"); + else if (cmd.equals("y-map")) Shell.expose(ymap.getViewer(),"y-map"); + else if (cmd.equals("c-map")) Shell.expose(cmap.getViewer(),"c-map"); + } +} \ No newline at end of file