From 3c65b1d5bc5c3545c31e6c68075c9493b6fdd4fa Mon Sep 17 00:00:00 2001 From: nifi Date: Thu, 28 Oct 2010 21:50:22 +0000 Subject: [PATCH] Added link direction to network graph --- .../se/sics/contiki/collect/gui/MapPanel.java | 39 +++++++++++++++++-- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/examples/sky-shell/src/se/sics/contiki/collect/gui/MapPanel.java b/examples/sky-shell/src/se/sics/contiki/collect/gui/MapPanel.java index eb729882e..7d045153e 100644 --- a/examples/sky-shell/src/se/sics/contiki/collect/gui/MapPanel.java +++ b/examples/sky-shell/src/se/sics/contiki/collect/gui/MapPanel.java @@ -26,7 +26,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: MapPanel.java,v 1.7 2010/10/22 13:39:52 nifi Exp $ + * $Id: MapPanel.java,v 1.8 2010/10/28 21:50:22 nifi Exp $ * * ----------------------------------------------------------------- * @@ -34,8 +34,8 @@ * * Authors : Joakim Eriksson, Niclas Finne * Created : 3 jul 2008 - * Updated : $Date: 2010/10/22 13:39:52 $ - * $Revision: 1.7 $ + * Updated : $Date: 2010/10/28 21:50:22 $ + * $Revision: 1.8 $ */ package se.sics.contiki.collect.gui; @@ -47,6 +47,7 @@ import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridLayout; +import java.awt.Polygon; import java.awt.RenderingHints; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -480,6 +481,7 @@ public class MapPanel extends JPanel implements Configurable, Visualizer, Action int x2 = linkNode.x; int y2 = linkNode.y; g2d.drawLine(n.x, n.y, x2, y2); + drawArrow(g, n.x, n.y, x2, y2, 3); if (!hideNetwork) { int xn1, xn2, yn1, yn2; if (n.x <= x2) { @@ -516,6 +518,36 @@ public class MapPanel extends JPanel implements Configurable, Visualizer, Action } } + private Polygon arrowPoly = new Polygon(); + private void drawArrow(Graphics g, int xSource, int ySource, int xDest, int yDest, int delta) { + double dx = xSource - xDest; + double dy = ySource - yDest; + double dir = Math.atan2(dx, dy); + double len = Math.sqrt(dx * dx + dy * dy); + dx /= len; + dy /= len; + len -= delta; + xDest = xSource - (int) (dx * len); + yDest = ySource - (int) (dy * len); + g.drawLine(xDest, yDest, xSource, ySource); + + final int size = 8; + arrowPoly.reset(); + arrowPoly.addPoint(xDest, yDest); + arrowPoly.addPoint(xDest + xCor(size, dir + 0.5), yDest + yCor(size, dir + 0.5)); + arrowPoly.addPoint(xDest + xCor(size, dir - 0.5), yDest + yCor(size, dir - 0.5)); + arrowPoly.addPoint(xDest, yDest); + g.fillPolygon(arrowPoly); + } + + private int yCor(int len, double dir) { + return (int)(0.5 + len * Math.cos(dir)); + } + + private int xCor(int len, double dir) { + return (int)(0.5 + len * Math.sin(dir)); + } + // ------------------------------------------------------------------- // ActionListener @@ -532,6 +564,7 @@ public class MapPanel extends JPanel implements Configurable, Visualizer, Action } else if (!isMap && source == lockedItem) { if (popupNode != null) { popupNode.hasFixedLocation = lockedItem.isSelected(); + repaint(); } } else if (!isMap && source == layoutItem) {