View Javadoc

1   package org.catacomb.graph.gui;
2   
3   
4   
5   import org.catacomb.report.E;
6   import org.catacomb.util.ColorUtil;
7   import org.catacomb.util.Formatter;
8   
9   import java.awt.Color;
10  
11  
12  
13  public class GridPainter {
14  
15      final static int[] intervals = {1, 2, 5};
16  
17  
18      Color gridColor;
19      Color axisColor;
20  
21      private boolean axesOnGrid = false;
22  
23      String xlabel = null;
24  
25  
26      public void setGridColor(Color c) {
27          gridColor = c;
28      }
29      public void setAxisColor(Color c) {
30          axisColor = c;
31      }
32  
33      public void setGridBackground(Color c) {
34          int ic = c.getRed() + c.getGreen() + c.getBlue();
35          if (ic > 380) {
36              gridColor = ColorUtil.verySlightlyDarker(c);
37          } else {
38              gridColor = ColorUtil.verySlightlyBrighter(c);
39          }
40      }
41  
42  
43  
44      public void paint(Painter p) {
45          double[] xyxy = p.getXYXYLimits();
46  
47          if (gridColor == null) {
48              setGridBackground(Color.gray);
49          }
50  
51          int width = p.getCanvasWidth();
52          int height = p.getCanvasHeight();
53  
54          double dx = xyxy[2] - xyxy[0];
55          double dy = xyxy[3] - xyxy[1];
56  
57          double[] xpts = getTickValues(6, xyxy[0], xyxy[2]);
58          int[] ixpts = getTicks(xpts, xyxy[0], xyxy[2], width);
59  
60          double[] ypts = getTickValues(6, xyxy[1], xyxy[3]);
61          int[] iypts = getTicks(ypts, xyxy[1], xyxy[3], height);
62  
63  
64          p.setColor(gridColor);
65  
66          for (int i = 0; i < ixpts.length; i++) {
67              p.drawPixelLine(ixpts[i], 0, ixpts[i], height);
68          }
69  
70          for (int i = 0; i < iypts.length; i++) {
71              p.drawPixelLine(0, height - iypts[i], width, height - iypts[i]);
72          }
73  
74          if (axesOnGrid) {
75  
76              if (axisColor != null) {
77                  p.setColor(axisColor);
78              } else {
79                  p.setColor(gridColor);
80              }
81  
82  
83              for (int i = 0; i < ixpts.length; i++) {
84                  p.drawCenteredString(Formatter.format(xpts[i], dx), ixpts[i], height-10);
85              }
86              for (int i = 0; i < iypts.length; i++) {
87                  p.drawString(Formatter.format(ypts[i], dy), 10, height-iypts[i]+4);
88              }
89  
90              if (xlabel != null) {
91                  p.drawString(xlabel, width/2, height-2);
92              }
93  
94          }
95  
96  
97      }
98  
99  
100 
101 
102     public final static double[] getTickValues(int ntick, double vlow, double vhigh) {
103 
104         double dv = 1.5 *  Math.abs(vhigh - vlow) / ntick;
105 
106         double log = Math.log(dv) / Math.log(10.);
107         double powten = (int) Math.floor(log);
108         int iiind = (int)(2.999 * (log - powten));
109         if (iiind < 0 || iiind >= 3) {
110             E.error(" gdc, 650: " + log + " " + powten +  " " + iiind);
111             iiind = 2;
112         }
113         int ii = intervals[iiind];
114         dv = Math.pow(10.0, powten) * ii;
115 
116         int i0 = (int)(vlow / dv);
117         int i1 = (int)(vhigh / dv);
118 
119         int nl = i1 - i0 + 1;
120 
121         double[] ret = new double[nl];
122         for (int i = 0; i < nl; i++) {
123 
124             ret[i] = (i0 + i) * dv;
125         }
126         return ret;
127     }
128 
129 
130 
131     public final static int[] getTicks(double[] va,
132                                        double vlow, double vhigh, int range) {
133         int nl = va.length;
134         int[] ret = new int[nl];
135 
136         for (int i = 0; i < nl; i++) {
137 
138             ret[i] = (int)(range * (va[i] - vlow) / (vhigh - vlow));
139         }
140         return ret;
141     }
142 
143 
144 
145     public void setOnGridAxes() {
146         axesOnGrid = true;
147     }
148 
149 
150 
151     public void setXAxisLabel(String s) {
152         xlabel = s;
153 
154     }
155 
156 
157 }