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
16
17
18
19
20 class ECMplot {
21
22
23
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
39
40
41
42
43
44
45 ECMplot(int ff) {
46
47
48
49
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
60
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
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 }