View Javadoc

1   package org.glassbox.graphview;
2   
3   import java.awt.*;
4   
5   public class ArrowTools {
6       private ArrowTools() {
7           //
8       }
9   
10      /***
11       * The given polygon will contain a bar vertical to the line.
12       */
13      public static void getReadBar(Point sp, Point ep, double bw, Polygon shape) {
14          shape.reset();
15          if (sp.x != ep.x) {
16              double m = (double) (ep.y - sp.y) / (double) (ep.x - sp.x);
17              double ax = calc(bw, m);
18              double ay = m * ax;
19              double by = calc(bw, m);
20              double bx = -m * by;
21              double cx = calc(bw*0.5, m);
22              double cy = m * cx;
23              if (sp.x > ep.x) {
24                  shape.addPoint((int) ((double) sp.x - ax + bx), (int) ((double) sp.y - ay + by));
25                  shape.addPoint((int) ((double) sp.x - ax + bx -cx), (int) ((double) sp.y - ay + by -cy));
26                  shape.addPoint((int) ((double) sp.x - ax - bx -cx), (int) ((double) sp.y - ay - by -cy));
27                  shape.addPoint((int) ((double) sp.x - ax - bx), (int) ((double) sp.y - ay - by));
28              } else {
29                  shape.addPoint((int) ((double) sp.x + ax + bx), (int) ((double) sp.y + ay + by));
30                  shape.addPoint((int) ((double) sp.x + ax + bx +cx), (int) ((double) sp.y + ay + by +cy));
31                  shape.addPoint((int) ((double) sp.x + ax - bx +cx), (int) ((double) sp.y + ay - by +cy));
32                  shape.addPoint((int) ((double) sp.x + ax - bx), (int) ((double) sp.y + ay - by));
33              }
34          } else {
35              if (sp.y > ep.y) {
36                  shape.addPoint((int) ((double) sp.x - bw), (int) ((double) sp.y - bw));
37                  shape.addPoint((int) ((double) sp.x - bw), (int) ((double) sp.y - bw*1.5));
38                  shape.addPoint((int) ((double) sp.x + bw), (int) ((double) sp.y - bw*1.5));
39                  shape.addPoint((int) ((double) sp.x + bw), (int) ((double) sp.y - bw));
40              } else {
41                  shape.addPoint((int) ((double) sp.x - bw), (int) ((double) sp.y + bw));
42                  shape.addPoint((int) ((double) sp.x - bw), (int) ((double) sp.y + bw*1.5));
43                  shape.addPoint((int) ((double) sp.x + bw), (int) ((double) sp.y + bw*1.5));
44                  shape.addPoint((int) ((double) sp.x + bw), (int) ((double) sp.y + bw));
45              }
46          }
47      }
48  
49      /***
50       * The given polygon will contain the arrow at the end of the line.
51       */
52      public static void getArrowShape(Point sp, Point ep, double arrl, double arrw, Polygon shape) {
53          shape.reset();
54          if (sp.x != ep.x) {
55              double m = (double) (ep.y - sp.y) / (double) (ep.x - sp.x);
56              double a = calc(arrl, m);
57              double b = m * a;
58              double f = calc(arrw, m);
59              double e = -m * f;
60              shape.addPoint(ep.x, ep.y);
61              if (sp.x > ep.x) {
62                  shape.addPoint((int) ((double) ep.x + a + e), (int) ((double) ep.y + b + f));
63                  shape.addPoint((int) ((double) ep.x + a - e), (int) ((double) ep.y + b - f));
64              } else {
65                  shape.addPoint((int) ((double) ep.x - a + e), (int) ((double) ep.y - b + f));
66                  shape.addPoint((int) ((double) ep.x - a - e), (int) ((double) ep.y - b - f));
67              }
68          } else {
69              shape.addPoint(ep.x, ep.y);
70              if (sp.y > ep.y) {
71                  shape.addPoint((int) ((double) ep.x - arrw), (int) ((double) ep.y + arrl));
72                  shape.addPoint((int) ((double) ep.x + arrw), (int) ((double) ep.y + arrl));
73              } else {
74                  shape.addPoint((int) ((double) ep.x - arrw), (int) ((double) ep.y - arrl));
75                  shape.addPoint((int) ((double) ep.x + arrw), (int) ((double) ep.y - arrl));
76              }
77          }
78      }
79  
80      private static double calc(double c, double m) {
81          return Math.sqrt(c * c / (1 + m * m));
82      }
83  
84  }