Project

General

Profile

« Previous | Next » 

Revision e99dd9d6

Added by Leszek Koltunski almost 8 years ago

Chasing a bug in DistortedCubesGrid.markRegions() ( visible with a 5x5 grid, 11111 11011 10101 11011 11111 ) - some side edges are missing. markRegions computes incorrect number of side Segments in this case.

View differences:

src/main/java/org/distorted/library/DistortedCubesGrid.java
82 82
      int frontWalls=0, frontSegments=0, sideWalls=0, sideBends=0, triangleShifts=0, windingShifts=0;
83 83
      int shiftCol = (mCols-1)/2;
84 84

  
85
      //boolean seenLand=false;
86
      //boolean firstBlockIsNE=false;
87 85
      boolean lastBlockIsNE=false;
88 86
      boolean thisBlockIsNE;        // the block we are currently looking at is split into
89 87
                                    // two triangles along the NE-SW line (rather than NW-SE)
90

  
91 88
      for(int row=0; row<mRows; row++)
92 89
         {
93 90
         if( mCols>=2 && (mCubes[row][shiftCol]%2 == 1) && (mCubes[row][shiftCol+1]%2 == 1) ) triangleShifts++;
......
99 96
              thisBlockIsNE = isNE(row,col);
100 97
              if( thisBlockIsNE^lastBlockIsNE ) windingShifts++;
101 98
              lastBlockIsNE = thisBlockIsNE;
102
/*
103
              if( !seenLand )
104
                {
105
                seenLand=true;
106
                firstBlockIsNE = thisBlockIsNE;
107
                }
108
*/
109 99
              frontWalls++;
110 100
              if( col==mCols-1 || mCubes[row][col+1]%2 == 0 ) frontSegments++;
111 101
              }
......
138 128

  
139 129
      int frontVert = 2*( frontWalls + 2*frontSegments - 1) +2*triangleShifts + windingShifts;
140 130
      int sideVert  = 2*( sideWalls + sideBends + edges -1);
141
      int firstWinding=0;
142
      //int secondWinding=0;
143

  
144
      if( !frontOnly )
145
        {
146
        if( (frontVert+1)%2==1 ) firstWinding=1;
147
        //if( (((frontVert+1)+firstWinding+(1+sideVert+1))%2==1)^firstBlockIsNE ) secondWinding=1;
148
        }
149

  
131
      int firstWinding=( !frontOnly && (frontVert+1)%2==1 ) ? 1:0;
150 132
      int dataL = frontOnly ? frontVert : (frontVert+1) +firstWinding+ (1+sideVert+1) + (1+frontVert);
151 133

  
152
      //android.util.Log.e("CUBES","triangleShifts="+triangleShifts+" windingShifts="+windingShifts);
153
      //android.util.Log.e("CUBES","Winding1="+firstWinding+" Winding2="+secondWinding);
154
      //android.util.Log.e("CUBES","frontVert="+frontVert+" sideVert="+sideVert);
155
      //android.util.Log.e("CUBES", "frontW="+frontWalls+" fSegments="+frontSegments+" sWalls="+sideWalls+" sSegments="+edges+" sideBends="+sideBends+" dataLen="+dataL );
134
      android.util.Log.e("CUBES","triangleShifts="+triangleShifts+" windingShifts="+windingShifts);
135
      android.util.Log.e("CUBES","Winding1="+firstWinding+" frontVert="+frontVert+" sideVert="+sideVert);
136
      android.util.Log.e("CUBES", "frontW="+frontWalls+" fSegments="+frontSegments+" sWalls="+sideWalls+" sSegments="+edges+" sideBends="+sideBends+" dataLen="+dataL );
156 137
      
157 138
      return dataL<0 ? 0:dataL;
158 139
      }
......
184 165
     }
185 166
*/  
186 167
///////////////////////////////////////////////////////////////////////////////////////////////////
187
/*
168

  
188 169
   private static String debug(Edge e)
189 170
     {
190 171
     String d = "";
......
201 182
     
202 183
     return d;
203 184
     }   
204
*/ 
185

  
205 186
///////////////////////////////////////////////////////////////////////////////////////////////////
206 187
// desc is guaranteed to be padded with 0s in the end (DistortedCubes constructor does it)
207 188

  
......
296 277
     int initCol, initRow;
297 278
     boolean kicked;
298 279
     Edge e;
299
     
280

  
300 281
     for(i=0; i<numEdges; i++) 
301 282
       {
302 283
       e = mEdges.get(i);
303 284
       initRow= e.row;
304 285
       initCol= e.col;
305 286
         
306
       //android.util.Log.e("CUBES", "checking edge "+debug(e));
287
       android.util.Log.e("CUBES", "checking edge "+debug(e));
307 288
             
308 289
       if( mCubes[initRow][initCol]%2==0 )
309 290
         {
......
313 294
         do
314 295
           {
315 296
           e = getNextEdge(e); 
316
           //android.util.Log.e("CUBES", " next edge "+debug(e));   
297
           android.util.Log.e("CUBES", " next edge "+debug(e));
317 298
       
318 299
           switch(e.side)
319 300
             {
......
325 306
           
326 307
           if( kicked )
327 308
             {
328
             //android.util.Log.e("CUBES", "kicking out edge!");
309
             android.util.Log.e("CUBES", "kicking out edge!");
329 310
             mEdges.remove(i);
330 311
             i--;
331 312
             numEdges--; 
332 313
             }
333 314
           }
334
         while( kicked==false && (e.col!=initCol || e.row!=initRow || e.side!=NORTH) );
315
         while( !kicked && (e.col!=initCol || e.row!=initRow || e.side!=NORTH) );
335 316
         
336
         if( kicked==false )
317
         if( !kicked )
337 318
           {
338 319
           mEdges.set(i, new Edge(SOUTH,e.row-1,e.col)); 
339 320
           }

Also available in: Unified diff