1 23 24 package de.progra.charting; 25 26 import java.util.*; 27 28 35 public class ChartUtilities { 36 37 46 public static double[] performAutoScale(double min, double max) { 47 double[] d = new double[2]; 49 double diff = max - min; 50 51 d[0] = floor(min, exp(diff)); 52 d[1] = ceil(max, exp(diff)); 53 54 return d; 55 } 56 57 63 public static double calculateTickSpacing(double min, double max) { 64 double spacing = 1.0; 65 66 double diff = max - min; 67 68 int exp = exp(diff); 69 70 exp--; 71 72 spacing = 1.0 * Math.pow(10.0, (double)exp); 73 74 if((diff / spacing) < 20) 77 return 0.5 * spacing; 78 else if((diff / spacing) > 40) 79 return 2 * spacing; 80 else 81 return spacing; 82 } 83 84 91 public static double interpolate(double xa[], double ya[], double x) { 92 99 100 if(xa.length != ya.length || xa.length == 0 || ya.length == 0) { 101 System.out.println("** Invalid Parameter"); 102 return Double.NaN; 103 } 104 105 int n = xa.length; 106 double y = 0.0; 107 double dy = 0.0; 108 109 int i, m, ns = 1; 110 double den, dif, dift, ho, hp, w; 111 double[] c = new double[n]; 112 double[] d = new double[n]; 113 dif = Math.abs(x - xa[0]); 114 115 for (i = 0; i < n; i++) { if ( (dift = Math.abs(x - xa[i])) < dif) { 117 ns = i; 118 dif=dift; 119 } 120 c[i] = ya[i]; d[i] = ya[i]; 122 } 123 124 y = ya[ns--]; 127 for (m = 0; m < n - 1; m++) { for (i = 0; i < n - m - 1; i++) { 130 ho = xa[i] - x; 132 hp = xa[i + m + 1] - x; 133 w = c[i + 1] - d[i]; 134 135 if ( (den = ho - hp) == 0.0) { 136 return Double.NaN; 137 } 138 140 142 den = w / den; 143 d[i] = hp * den; c[i] = ho * den; 145 } 147 148 y += (dy = (2 * (ns + 1) < (n - m) ? c[ns + 1] : d[ns--])); 149 151 159 } 160 161 return y; 162 } 163 164 171 public static double floor(double d, int exp) { 172 double x = 1.0 * Math.pow(10.0, (double)exp); 173 174 return Math.floor(d / x) * x; 175 } 176 177 184 public static double ceil(double d, int exp) { 185 double x = 1.0 * Math.pow(10.0, (double)exp); 186 187 return Math.ceil(d / x) * x; 188 } 189 190 196 public static int exp(double d) { 197 int exp = 0; 198 boolean positive = (d <= -1 || d >= 1 ); 199 200 while((d <= -10) || (d >= 10) || ((d > -1) && (d < 1))) { 201 if(positive) { 202 d /= 10; 203 exp++; 204 } else { 205 d *= 10; 206 exp--; 207 } 208 } 209 210 return exp; 211 } 212 213 214 217 public static Number [][] transformArray(int[][] data) { 218 Number [][] n = new Number [data.length][data[0].length]; 219 220 for(int i = 0; i < data.length; i++) 221 for(int j = 0; j < data[0].length; j++) 222 n[i][j] = new Integer (data[i][j]); 223 224 return n; 225 } 226 227 230 public static Number [][] transformArray(double[][] data) { 231 Number [][] n = new Number [data.length][data[0].length]; 232 233 for(int i = 0; i < data.length; i++) 234 for(int j = 0; j < data[0].length; j++) 235 n[i][j] = new Double (data[i][j]); 236 237 return n; 238 } 239 240 243 public static Number [] transformArray(double[] data) { 244 Number [] n = new Number [data.length]; 245 246 for(int i = 0; i < data.length; i++) 247 n[i] = new Double (data[i]); 248 249 return n; 250 } 251 252 255 public static Number [] transformArray(int[] data) { 256 Number [] n = new Number [data.length]; 257 258 for(int i = 0; i < data.length; i++) 259 n[i] = new Integer (data[i]); 260 261 return n; 262 } 263 264 265 public static void addDataToSet(TreeSet set, Number [][] data) { 266 for(int i = 0; i < data.length; i++) { 267 set.addAll(Arrays.asList(data[i])); 268 } 269 } 270 271 272 public static void main(String [] args) { 273 double min = -0.00337; 274 double max = 0.00745; 275 276 double[] d = performAutoScale(min, max); 277 278 System.out.println("** AutoScaling: ("+min+", "+max+") -> ("+d[0]+", "+d[1]+")"); 279 280 double s = calculateTickSpacing(d[0], d[1]); 281 282 System.out.print("** Ticks: "); 283 for(double i = d[0]; i <= d[1]; i += s) 284 System.out.print(" "+i+" "); 285 System.out.println(); 286 287 System.out.println("** Performing interpolation for 4*x^2"); 288 System.out.println("** Given values [-4, 64], [0, 0], [3, 36]"); 289 290 double xa[] = {-4.0, 0.0, 3.0}; 291 double ya[] = {64.0, 0.0, 36.0}; 292 293 System.out.print("** Calculating values"); 294 297 for(double i = -5.0; i < 6.0; i += 0.5) { 298 System.out.print("["+i+", "+interpolate(xa, ya, i)+"]"); 299 } 300 301 System.out.println(); 302 303 System.out.println("** Performing interpolation for 5 * x^3 - 4 * x^2 + 2 * x - 5"); 304 System.out.println("** Given values [-5, -740], [0, -5], [1, -2], [5, 530]"); 305 306 double xb[] = {-5.0, 0.0, 1.0, 5.0}; 307 double yb[] = {-740.0, -5.0, -2.0, 530.0}; 308 309 System.out.print("** Calculating values "); 310 311 for(double i = -5.0; i < 6.0; i += 0.5) { 312 System.out.print("["+i+", "+interpolate(xb, yb, i)+"]"); 313 } 314 315 System.out.println(); 316 317 } 318 } 319 | Popular Tags |