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 }