Project

General

Profile

« Previous | Next » 

Revision 693cc52e

Added by Leszek Koltunski 12 months ago

speedup

View differences:

src/main/java/org/distorted/objectlib/tablebases/TablebasesAbstract.java
32 32
  private final int mNumQuats;
33 33
  private final float[][] mCuts;
34 34
  private final int[] mNumCuts;
35
  private final int[][] mCubitRows;
36
  private final int[][] mCubitQuatMap;
37
  private final float[][] mQuats;
38
  private final float[][] mPosition;
35 39

  
36 40
  private int[][] mQuatMult;
37 41
  private int[] mInvertedQuat;
......
39 43
  Tablebase mTablebase;
40 44
  boolean mInitialized;
41 45

  
42
  final float[][] mQuats;
43 46
  final int mScalingFactor;
44 47
  final int mNumAxis;
45
  final float[][] mPosition;
46 48
  final int[][] mRotRow;
47 49
  final int mNumCubits;
48 50
  final boolean[][] mRotatable;
49 51

  
50
  static final float[] mTmp = new float[4];
52
  private static final float[] mTmp = new float[4];
51 53

  
52 54
///////////////////////////////////////////////////////////////////////////////////////////////////
53 55

  
......
102 104

  
103 105
    mScalingFactor = scaling;
104 106
    mRotRow = new int[mNumCubits][mNumAxis];
107

  
108
    mCubitRows = new int[mNumCubits][mNumAxis];
109
    mCubitQuatMap = new int[mNumCubits][mNumQuats];
110

  
111
    for(int i=0; i<mNumCubits; i++)
112
      {
113
      computeInitRow(i,mCubitRows[i]);
114
      for(int j=0; j<mNumQuats; j++) mCubitQuatMap[i][j] = computeMap(i,j);
115
      }
116

  
105 117
    mInitialized = false;
106 118
    }
107 119

  
......
135 147
      }
136 148
    }
137 149

  
150
///////////////////////////////////////////////////////////////////////////////////////////////////
151

  
152
  private int computeMap(int cubit, int quat)
153
    {
154
    float[] pos = mPosition[cubit];
155
    float[] q = mQuats[quat];
156

  
157
    QuatHelper.rotateVectorByQuat(mTmp,pos[0],pos[1],pos[2],1.0f,q);
158
    float dist = Float.MAX_VALUE;
159
    int min = 0;
160

  
161
    for(int i=0; i<mNumCubits; i++)
162
      {
163
      float[] p = mPosition[i];
164
      float dx = p[0]-mTmp[0];
165
      float dy = p[1]-mTmp[1];
166
      float dz = p[2]-mTmp[2];
167

  
168
      float d = dx*dx + dy*dy + dz*dz;
169

  
170
      if( d<dist )
171
        {
172
        dist = d;
173
        min = i;
174
        }
175
      }
176

  
177
    return min;
178
    }
179

  
138 180
///////////////////////////////////////////////////////////////////////////////////////////////////
139 181

  
140 182
  int computeBitLayer(int ax, int layer)
......
144 186

  
145 187
///////////////////////////////////////////////////////////////////////////////////////////////////
146 188

  
147
  void computeRow(float[] pos, int quat, int[] output)
189
  void computeInitRow(int cubit, int[] output)
148 190
    {
149
    int len = pos.length/3;
150
    float[] q = mQuats[quat];
191
    float[] pos = mPosition[cubit];
151 192
    int num = output.length;
152 193

  
153
    for(int i=0; i<len; i++)
194
    for(int i=0; i<num; i++)
154 195
      {
155
      QuatHelper.rotateVectorByQuat(mTmp,pos[3*i],pos[3*i+1],pos[3*i+2],1.0f,q);
156

  
157
      for(int j=0; j<num; j++)
158
        {
159
        output[j] = 0;
160
        Static3D axis = mAxis[j];
161
        float axisX = axis.get0();
162
        float axisY = axis.get1();
163
        float axisZ = axis.get2();
164
        float casted = mTmp[0]*axisX + mTmp[1]*axisY + mTmp[2]*axisZ;
165
        output[j] |= computeSingleRow(j,casted);
166
        }
196
      Static3D axis = mAxis[i];
197
      float axisX = axis.get0();
198
      float axisY = axis.get1();
199
      float axisZ = axis.get2();
200
      float casted = pos[0]*axisX + pos[1]*axisY + pos[2]*axisZ;
201
      output[i] = computeSingleRow(i,casted);
167 202
      }
168 203
    }
169 204

  
......
181 216
    return (1<<num);
182 217
    }
183 218

  
219
///////////////////////////////////////////////////////////////////////////////////////////////////
220

  
221
  int[] computeRow(int cubit, int quat)
222
    {
223
    int newPos = mCubitQuatMap[cubit][quat];
224
    return mCubitRows[newPos];
225
    }
226

  
184 227
///////////////////////////////////////////////////////////////////////////////////////////////////
185 228
// remember about the double cover or unit quaternions!
186 229

  
......
281 324
    byte newLevel = (byte)(level+1);
282 325
    int quatBasis = 0;
283 326

  
284
    for(int cubit=0; cubit<mNumCubits; cubit++) computeRow(mPosition[cubit],quats[cubit],mRotRow[cubit]);
327
    for(int cubit=0; cubit<mNumCubits; cubit++) mRotRow[cubit] = computeRow(cubit,quats[cubit]);
285 328

  
286 329
    for(int ax=0; ax<mNumAxis; ax++)
287 330
      {
......
482 525
      data[2]=1;
483 526
      data[3]=1;
484 527

  
485
      for(int cubit=0; cubit<mNumCubits; cubit++) computeRow(mPosition[cubit],quats[cubit],mRotRow[cubit]);
528
      for(int cubit=0; cubit<mNumCubits; cubit++) mRotRow[cubit] = computeRow(cubit,quats[cubit]);
486 529

  
487 530
      for(int s=0; s<mScalingFactor && !found; s++)
488 531
        {
......
586 629
    data[2]=1;
587 630
    data[3]=1;
588 631

  
589
    for(int cubit=0; cubit<mNumCubits; cubit++) computeRow(mPosition[cubit],quats[cubit],mRotRow[cubit]);
632
    for(int cubit=0; cubit<mNumCubits; cubit++) mRotRow[cubit] = computeRow(cubit,quats[cubit]);
590 633

  
591 634
    for(int s=0; s<mScalingFactor; s++)
592 635
      {

Also available in: Unified diff