Advertisement
martinus

pow approximation with 2D lookup table

Dec 10th, 2011
275
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 1.66 KB | None | 0 0
  1. public class PowLookupTable {
  2.  
  3.     private final double[] _table;
  4.     private final double _min_a;
  5.     private final double _max_a;
  6.     private final double _min_b;
  7.     private final double _max_b;
  8.     private final int _size;
  9.     private double _diff_a;
  10.     private double _diff_b;
  11.  
  12.     public PowLookupTable(double min_a, double max_a, double min_b,
  13.             double max_b, int size) {
  14.         _min_a = min_a;
  15.         _max_a = max_a;
  16.         _min_b = min_b;
  17.         _max_b = max_b;
  18.         _diff_a = _max_a - _min_a;
  19.         _diff_b = _max_b - _min_b;
  20.         _size = size;
  21.         _table = new double[size * size];
  22.  
  23.         // calculate weights
  24.         for (int a = 0; a < size; ++a) {
  25.             for (int b = 0; b < size; ++b) {
  26.                 double da = _diff_a * a / (size - 1) + _min_a;
  27.                 double db = _diff_b * b / (size - 1) + _min_b;
  28.                 _table[a * size + b] = Math.pow(da, db);
  29.             }
  30.         }
  31.  
  32.     }
  33.  
  34.     public double pow(double a, double b) {
  35.         // calculate exact position on grid
  36.         double grid_pos_a = (a - _min_a) / _diff_a * (_size - 1);
  37.         double grid_pos_b = (b - _min_b) / _diff_b * (_size - 1);
  38.  
  39.         // calculate upper left index
  40.         int idx_a = (int) grid_pos_a;
  41.         int idx_b = (int) grid_pos_b;
  42.  
  43.         // get entries
  44.         double ul = _table[idx_a * _size + idx_b];
  45.         double ur = _table[idx_a * _size + idx_b + 1];
  46.         double ll = _table[idx_a * _size + idx_b + _size];
  47.         double lr = _table[idx_a * _size + idx_b + 1 + _size];
  48.  
  49.         // first linear interpolation between ul and ur
  50.         double tmp_a = grid_pos_a - idx_a;
  51.         double u = ul * (1 - tmp_a) + tmp_a * ur;
  52.         double l = ll * (1 - tmp_a) + tmp_a * lr;
  53.  
  54.         // now linear interpolate between these two results
  55.         double tmp_b = grid_pos_b - idx_b;
  56.         double r = u * (1 - tmp_b) + tmp_b * l;
  57.  
  58.         return r;
  59.     }
  60. }
  61.  
  62.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement