View Javadoc
1   package com.github.celldynamics.quimp.plugin.ecmm;
2   
3   import com.github.celldynamics.quimp.Outline;
4   import com.github.celldynamics.quimp.QColor;
5   import com.github.celldynamics.quimp.Vert;
6   import com.github.celldynamics.quimp.geom.ExtendedVector2d;
7   
8   import ij.ImagePlus;
9   import ij.ImageStack;
10  import ij.gui.NewImage;
11  import ij.process.FloatPolygon;
12  import ij.process.ImageProcessor;
13  
14  /**
15   * Class responsible for plotting ECMM outlines during computations.
16   * 
17   * @author rtyson
18   *
19   */
20  class ECMplot {
21  
22    /**
23     * Default title for ECMM image.
24     */
25    public static final String ECMM_TITLE = "ECMM_mappings";
26    public ImagePlus imPlus;
27    public ImageStack imStack;
28    public ImageProcessor imProc;
29    public int drawFrame = 1;
30    public ExtendedVector2d centre;
31    public double scale;
32    public QColor color;
33    private int intersectSize = 6;
34    private int textPos = 25;
35    public int width;
36    public int height;
37    public int frame;
38    // private int percentScreen = 65; //make visual output x% of screen height
39  
40    /**
41     * Create ECMM plot.
42     * 
43     * @param ff number of frames
44     */
45    ECMplot(int ff) {
46  
47      // Dimension screen = IJ.getScreenSize();
48      // ECMp.visualRes = (int) Math.round((screen.height / 100d) *
49      // percentScreen);
50      double fitTo = ECMp.visualRes * 0.7;
51      scale = fitTo / ECMp.maxCellSize;
52  
53      width = ECMp.visualRes;
54      height = ECMp.visualRes;
55  
56      frame = ff;
57      centre = new ExtendedVector2d(0, 0);
58      color = new QColor(1, 1, 1);
59      // imPlus = NewImage.createByteImage("ECMM mappings", width, height, frame,
60      // NewImage.FILL_BLACK);
61      imPlus = NewImage.createRGBImage(ECMM_TITLE, width, height, frame, NewImage.FILL_WHITE);
62      imStack = imPlus.getStack();
63      imPlus.show();
64    }
65  
66    public void setDrawingFrame(int d) {
67      drawFrame = d - ECMp.startFrame + 1;
68      textPos = 25;
69      imProc = imStack.getProcessor(drawFrame);
70      this.writeText("Frame map " + d + " to " + (d + 1));
71    }
72  
73    public void writeText(String text) {
74      this.setColor(0, 0, 0);
75      imProc.drawString(text, 10, textPos);
76      textPos += 15;
77    }
78  
79    public void drawOutline(Outline o) {
80      Vert v = o.getHead();
81      do {
82        drawLine(v, v.getNext());
83        v = v.getNext();
84      } while (!v.isHead());
85    }
86  
87    public void drawPolygon(FloatPolygon p) {
88      Vert va;
89      Vert vb;
90      for (int i = 0; (i + 1) < p.xpoints.length; i++) {
91        va = new Vert(p.xpoints[i], p.ypoints[i], i);
92        vb = new Vert(p.xpoints[i + 1], p.ypoints[i + 1], i);
93        drawLine(va, vb);
94  
95      }
96    }
97  
98    public void drawLine(Vert" href="../../../../../../com/github/celldynamics/quimp/Vert.html#Vert">Vert v1, Vert v2) {
99  
100     ExtendedVector2dmp/geom/ExtendedVector2d.html#ExtendedVector2d">ExtendedVector2d a = new ExtendedVector2d(v1.getX(), v1.getY());
101     ExtendedVector2dmp/geom/ExtendedVector2d.html#ExtendedVector2d">ExtendedVector2d b = new ExtendedVector2d(v2.getX(), v2.getY());
102     relocate(a);
103     relocate(b);
104 
105     imProc.drawLine((int) a.getX(), (int) a.getY(), (int) b.getX(), (int) b.getY());
106   }
107 
108   public void drawLine(ExtendedVector2d./../../../../com/github/celldynamics/quimp/geom/ExtendedVector2d.html#ExtendedVector2d">ExtendedVector2d aa, ExtendedVector2d bb) {
109 
110     ExtendedVector2dmp/geom/ExtendedVector2d.html#ExtendedVector2d">ExtendedVector2d a = new ExtendedVector2d(aa.getX(), aa.getY());
111     ExtendedVector2dmp/geom/ExtendedVector2d.html#ExtendedVector2d">ExtendedVector2d b = new ExtendedVector2d(bb.getX(), bb.getY());
112     relocate(a);
113     relocate(b);
114 
115     imProc.drawLine((int) a.getX(), (int) a.getY(), (int) b.getX(), (int) b.getY());
116   }
117 
118   public void setSlice(int f) {
119     this.repaint();
120     imPlus.setSlice(f);
121   }
122 
123   public void drawPath(ExtendedVector2d[] data) {
124     relocate(data[0]);
125     for (int i = 0; i < data.length - 1; i++) {
126       if (data[i + 1] == null) {
127         break;
128       }
129       relocate(data[i + 1]);
130       imProc.drawLine((int) data[i].getX(), (int) data[i].getY(), (int) data[i + 1].getX(),
131               (int) data[i + 1].getY());
132     }
133   }
134 
135   private void relocate(ExtendedVector2d p) {
136     // move a point to the centre
137     p.addVec(new ExtendedVector2d(-centre.getX(), -centre.getY()));
138     p.multiply(scale);
139     p.addVec(new ExtendedVector2d(ECMp.visualRes / 2, ECMp.visualRes / 2));
140 
141   }
142 
143   public void setColor(double r, double g, double b) {
144     color.setRGB(r, g, b);
145     imProc.setColor(color.getColorInt());
146   }
147 
148   public void drawIntersect(Vert i) {
149     this.drawCircle(i.getPoint(), intersectSize);
150   }
151 
152   public void drawCircle(ExtendedVector2d a, int s) {
153     ExtendedVector2dmp/geom/ExtendedVector2d.html#ExtendedVector2d">ExtendedVector2d v = new ExtendedVector2d(a.getX(), a.getY());
154     relocate(v);
155     imProc.drawOval((int) v.getX() - (s / 2), (int) v.getY() - (s / 2), s, s);
156   }
157 
158   public void drawCross(ExtendedVector2d a, int s) {
159     ExtendedVector2dmp/geom/ExtendedVector2d.html#ExtendedVector2d">ExtendedVector2d p = new ExtendedVector2d(a.getX(), a.getY());
160     relocate(p);
161     imProc.drawLine((int) p.getX() - s, (int) p.getY() - s, (int) p.getX() + s, (int) p.getY() + s);
162     imProc.drawLine((int) p.getX() + s, (int) p.getY() - s, (int) p.getX() - s, (int) p.getY() + s);
163   }
164 
165   public void repaint() {
166     imPlus.repaintWindow();
167   }
168 
169   public void close() {
170     try {
171       imPlus.close();
172     } catch (Exception e) {
173       System.out.println("ECMM Plot could not be closed (prob not open)");
174     }
175   }
176 }