Project

General

Profile

« Previous | Next » 

Revision dcf9de7b

Added by Leszek Koltunski 12 months ago

Correct a subtle bug: the way we were computing the cached Rows was incorrect in case of Pyraminx, because its initial positions of all of its edge and octa cubits are the same, and initial quats are non-zero.

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;
35
  private final int[][][] mCubitQuatRows;
37 36
  private final float[][] mQuats;
38 37
  private final float[][] mPosition;
39 38

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

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

  
111 109
    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
      }
110
      for(int j=0; j<mNumQuats; j++) mCubitQuatRows[i][j] = computeMap(i,j);
116 111

  
117 112
    mInitialized = false;
118 113
    }
......
149 144

  
150 145
///////////////////////////////////////////////////////////////////////////////////////////////////
151 146

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

  
157 152
    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 153

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

  
170
      if( d<dist )
171
        {
172
        dist = d;
173
        min = i;
174
        }
175
      }
154
    int[] output = new int[mNumAxis];
176 155

  
177
    return min;
178
    }
179

  
180
///////////////////////////////////////////////////////////////////////////////////////////////////
181

  
182
  int computeBitLayer(int ax, int layer)
183
    {
184
    return (1<<layer);
185
    }
186

  
187
///////////////////////////////////////////////////////////////////////////////////////////////////
188

  
189
  void computeInitRow(int cubit, int[] output)
190
    {
191
    float[] pos = mPosition[cubit];
192
    int num = output.length;
193

  
194
    for(int i=0; i<num; i++)
156
    for(int i=0; i<mNumAxis; i++)
195 157
      {
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;
158
      Static3D ax = mAxis[i];
159
      float axisX = ax.get0();
160
      float axisY = ax.get1();
161
      float axisZ = ax.get2();
162
      float casted = mTmp[0]*axisX + mTmp[1]*axisY + mTmp[2]*axisZ;
201 163
      output[i] = computeSingleRow(i,casted);
202 164
      }
165

  
166
    return output;
203 167
    }
204 168

  
205 169
///////////////////////////////////////////////////////////////////////////////////////////////////
......
216 180
    return (1<<num);
217 181
    }
218 182

  
183
///////////////////////////////////////////////////////////////////////////////////////////////////
184

  
185
  int computeBitLayer(int ax, int layer)
186
    {
187
    return (1<<layer);
188
    }
189

  
219 190
///////////////////////////////////////////////////////////////////////////////////////////////////
220 191

  
221 192
  int[] computeRow(int cubit, int quat)
222 193
    {
223
    int newPos = mCubitQuatMap[cubit][quat];
224
    return mCubitRows[newPos];
194
    return mCubitQuatRows[cubit][quat];
225 195
    }
226 196

  
227 197
///////////////////////////////////////////////////////////////////////////////////////////////////

Also available in: Unified diff