Loading src/main/java/TileSurface.java +211 −75 Original line number Diff line number Diff line Loading @@ -449,7 +449,7 @@ public class TileSurface { double [] wnd = new double [size * size]; int indx = 0; for (int i = 0; i < size; i++){ for (int j = 0; i < size; i++){ for (int j = 0; j < size; j++){ wnd[indx++] = wnd1d[i]*wnd1d[j]; } } Loading Loading @@ -953,13 +953,6 @@ public class TileSurface { int stileY = nsTile / stilesX; int stileX = nsTile % stilesX; for (int np = 0; np < planes[nsTile].length; np++) if (planes[nsTile][np] != null){ /* int surf_number = getTileSurfaceNumber ( // maximal number of surfaces in this supertile nsTile, // int nsTile, -1, // int dir, // direction, or -1 (same) np, // 0, // int np, planes); // TilePlanes.PlaneData [][] planes) */ int [][][] src_mesh = lappingMeshes[nsTile][np]; double [][] disp_strength = fusedSupertilePlanes[nsTile][np]; TileData [] dual_mesh = new TileData [len2]; // full overlapping dual-sized mesh Loading @@ -967,28 +960,6 @@ public class TileSurface { System.out.println("createTileShells():2, *** NULL here*** nsTile = "+nsTile+" np="+np); continue; } /* int [] sNeibs = planes[nsTile][np].getNeibBest(); int [] surface_numbers = new int [8]; for (int dir = 0; dir < 8; dir++){ int nsTile1 = getNStileDir(nsTile, dir); if (sNeibs[dir] >= 0){ surface_numbers[dir] = getTileSurfaceNumber ( // maximal number of surfaces in this supertile nsTile1, // int nsTile, -1, // int dir, // direction, or -1 (same) sNeibs[dir], // int np, planes); } else if (nsTile1 >= 0){ surface_numbers[dir] = getTileSurfaceNumber ( // maximal number of surfaces in this supertile nsTile1, // int nsTile, ((dir + 4) % 8), // int dir, // direction, or -1 (same) np, // 0, // int np, planes); } else { // out of the picture surface_numbers[dir] = -1; // out of the picture } } */ for (int indx = 0 ; indx < len2; indx++){ // src_mesh non-null elements can only be generated by this supertile, while // neighbor links can point to others (connected). Loading @@ -1001,32 +972,12 @@ public class TileSurface { if (src_neibs != null){ int tsegm = tileNeibs.getSegment(indx); int nsTile0 = getNStileDir(nsTile, tsegm); // supertile over which this tile is // if ( (tsegm < 0) || // own tile (center square) // (surface_numbers[tsegm] >= 0)) { // <0 - out of picture area if ( (tsegm < 0) || // own tile (center square) (nsTile0 >= 0)) { // <0 - out of picture area dual_mesh[indx] = new TileData( // now sets neighbors to -1 disp_strength[0][indx], // disparity disp_strength[1][indx]); // strength dual_mesh[indx].setDbgNsTile(nsTile); /* if (tsegm < 0) { // own (center) dual_mesh[indx].setIndex(surf_number); } else { // dual_mesh[indx].setIndex(surface_numbers[tsegm]); // the cell is generated byh this supertile, so if the segment is outside // of the home area (tsegm >= 0), surface will be numbered as destinatination // supertile coming from this // int nsTile2 = getNStileDir(nsTile, tsegm); // negative segm 1 is OK ? int dir1from2 = getDirToStile(nsTile0, nsTile); // can be -1; int surf = getTileSurfaceNumber ( // maximal number of surfaces in this supertile nsTile0, // int nsTile, dir1from2, // int dir, // direction, or -1 (same) np, // int np, planes); dual_mesh[indx].setIndex(surf); } */ int dirThisfrom0 = getDirToStile(nsTile0, nsTile); // can be -1; int surf0 = getTileSurfaceNumber ( // Number of the surface for the tile itself nsTile0, // int nsTile, Loading @@ -1048,7 +999,6 @@ public class TileSurface { // nsTile2 - non-overlapping supertile where the destination tile belongs // Unique surface number should be determined for nsTile2, generated by nsTile1, // for direction how nsTile1 is visible from the nsTile2 // int dir1from2 = getDirToStile(nsTile2, nsTile1); // can be -1; int dir1from2 = getDirToStile(nsTile2, nsTile1); // can be -1; int surf = getTileSurfaceNumber ( // maximal number of surfaces in this supertile nsTile2, // int nsTile, Loading @@ -1064,38 +1014,16 @@ public class TileSurface { } // Now we have a double-sized surface with all tiles set with correct absolute indices, now just split it //surf_number = int sh3 = 3 * sh; for (int ty = 0; ty < ss2; ty++ ){ for (int tx = 0; tx < ss2; tx++ ){ int indx = ty * ss2 + tx; if (dual_mesh[indx] != null) { // some cells may be missing after merge int tsegm = tileNeibs.getSegment(indx); // int nsTile1 = getNStileDir(nsTile,tsegm); int ix, iy; /* switch (tsegm){ case -1 : ix = tx - sh ; iy = ty - sh ; break; case 0 : ix = tx - sh ; iy = ty + sh ; break; case 1 : ix = tx - sh3; iy = ty + sh ; break; case 2 : ix = tx - sh3; iy = ty - sh ; break; case 3 : ix = tx - sh3; iy = ty + sh3; break; case 4 : ix = tx - sh ; iy = ty + sh3; break; case 5 : ix = tx + sh ; iy = ty + sh3; break; case 6 : ix = tx + sh ; iy = ty - sh ; break; case 7 : ix = tx + sh ; iy = ty + sh ; break; default: ix = tx -sh; iy = ty -sh; } */ ix = (stileX * superTileSize) + tx -sh; iy = (stileY * superTileSize) + ty -sh; // if ((ix >= 0) && (ix < superTileSize) && (iy >= 0) && (iy < superTileSize)) { // int tindx = ((stileY * superTileSize) + iy) * tilesX + ((stileX * superTileSize) + ix); if ((ix >= 0) && (ix < tilesX) && (iy >= 0) && (iy < tilesX)) { int tindx = iy * tilesX + ix; // if () tile_data[tindx][dual_mesh[indx].getIndex()] = dual_mesh[indx]; //oob // tile_data[nsTile1][iy * superTileSize + ix][dual_mesh[indx].getIndex()] = dual_mesh[indx]; } } } Loading Loading @@ -1222,6 +1150,195 @@ public class TileSurface { return tile_data; } public void checkShellsConnections ( final TileData [][] tileData, final int debugLevel, final int dbg_X, final int dbg_Y) { final int nStiles = stilesX * stilesY; final int nTiles = nStiles * superTileSize * superTileSize; // final TileData [][] tile_data = new TileData [nTiles][]; final Thread[] threads = ImageDtt.newThreadArray(threadsMax); final AtomicInteger ai = new AtomicInteger(0); final int dbg_stile = (dbg_Y * superTileSize) * (stilesX * superTileSize) + (dbg_X * superTileSize); // final int dbg_tile = dbg_Y * stilesX + dbg_X; final int dbg_tilesX = stilesX * superTileSize; for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { public void run() { for (int nTile = ai.getAndIncrement(); nTile < nTiles; nTile = ai.getAndIncrement()) { int dbg_stX = nTile % dbg_tilesX; int dbg_stY = nTile / dbg_tilesX; int dbg_st = (dbg_stY / superTileSize) * stilesX + (dbg_stX / superTileSize); int dl = ((debugLevel > -1) && (dbg_st == dbg_stile)) ? 3:0; if (dl > 0){ System.out.println("checkShellsConnections(), nTile = "+nTile+ ", nsTile = "+dbg_st); } if (tileData[nTile] != null){ for (int nl = 0; nl < tileData[nTile].length; nl++){ if (tileData[nTile][nl] != null){ int [] neibs = tileData[nTile][nl].getNeighbors(); for (int dir = 0; dir < neibs.length; dir++){ if (neibs[dir] >= 0){ int nTile1 = getNtileDir(nTile, dir); if (nTile1 >= 0) { if ((tileData[nTile1] == null) || (tileData[nTile1][neibs[dir]] == null)){ if (debugLevel > -1) { int dbg_sstile = tileData[nTile][nl].getDbgNsTile(); int dbg_stileX = dbg_sstile % stilesX; int dbg_stileY = dbg_sstile / stilesX; int dbg_tx = nTile % dbg_tilesX; int dbg_ty = nTile / dbg_tilesX; int dbg_dx = dbg_tx - (superTileSize * dbg_stileX + superTileSize/2); int dbg_dy = dbg_ty - (superTileSize * dbg_stileY + superTileSize/2); System.out.println("Broken link: "+nTile1+ " from "+nTile+", nl="+nl+", dir = "+dir+ ", dbg_stX="+dbg_stX+", dbg_stY="+dbg_stY+", dbg_st="+dbg_st+", neibs[dir]="+neibs[dir]+ " dbg_nsTile = "+dbg_sstile +" ("+dbg_stileX+":"+dbg_stileY+")"+ " nTile="+nTile+" ("+dbg_tx+":"+dbg_ty+")"+ ", deltas from src center: "+dbg_dx+":"+dbg_dy); } neibs[dir] = -2; // was broken link } else { // check if link is mutual int [] neibs_other = tileData[nTile1][neibs[dir]].getNeighbors(); if (neibs_other[(dir + 4) % 8] != nl){ if (debugLevel > -1) { int dbg_sstile = tileData[nTile][nl].getDbgNsTile(); int dbg_stileX = dbg_sstile % stilesX; int dbg_stileY = dbg_sstile / stilesX; int dbg_tx = nTile % dbg_tilesX; int dbg_ty = nTile / dbg_tilesX; int dbg_dx = dbg_tx - (superTileSize * dbg_stileX + superTileSize/2); int dbg_dy = dbg_ty - (superTileSize * dbg_stileY + superTileSize/2); System.out.println("Link not mutual: "+nTile1+ " from "+nTile+", nl="+nl+", dir = "+dir+ ", dbg_stX="+dbg_stX+", dbg_stY="+dbg_stY+", dbg_st="+dbg_st+", neibs[dir]="+neibs[dir]+ " dbg_nsTile = "+dbg_sstile +" ("+dbg_stileX+":"+dbg_stileY+")"+ " nTile="+nTile+" ("+dbg_tx+":"+dbg_ty+")"+ ", deltas from src center: "+dbg_dx+":"+dbg_dy+ ", neibs_other["+((dir + 4) % 8)+"]="+neibs_other[(dir + 4) % 8]+ ", dbg_nsTile other="+tileData[nTile1][neibs[dir]].getDbgNsTile()); } neibs[dir] = -3; // not a mutual link (break only this side here) } } } } } } } } } } }; } ImageDtt.startAndJoin(threads); } public void addBackShellsConnections ( final TileData [][] tileData, final int debugLevel, final int dbg_X, final int dbg_Y) { final int nStiles = stilesX * stilesY; final int nTiles = nStiles * superTileSize * superTileSize; // final TileData [][] tile_data = new TileData [nTiles][]; final Thread[] threads = ImageDtt.newThreadArray(threadsMax); final AtomicInteger ai = new AtomicInteger(0); final int dbg_stile = (dbg_Y * superTileSize) * (stilesX * superTileSize) + (dbg_X * superTileSize); // final int dbg_tile = dbg_Y * stilesX + dbg_X; final int dbg_tilesX = stilesX * superTileSize; for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { public void run() { for (int nTile = ai.getAndIncrement(); nTile < nTiles; nTile = ai.getAndIncrement()) { int dbg_stX = nTile % dbg_tilesX; int dbg_stY = nTile / dbg_tilesX; int dbg_st = (dbg_stY / superTileSize) * stilesX + (dbg_stX / superTileSize); int dl = ((debugLevel > -1) && (dbg_st == dbg_stile)) ? 3:0; if (dl > 0){ System.out.println("checkShellsConnections(), nTile = "+nTile+ ", nsTile = "+dbg_st); } if (tileData[nTile] != null){ for (int nl = 0; nl < tileData[nTile].length; nl++){ if (tileData[nTile][nl] != null){ int [] neibs = tileData[nTile][nl].getNeighbors(); for (int dir = 0; dir < neibs.length; dir++){ if (neibs[dir] >= 0){ int nTile1 = getNtileDir(nTile, dir); if (nTile1 >= 0) { if ((tileData[nTile1] == null) || (tileData[nTile1][neibs[dir]] == null)){ if (debugLevel > 0) { int dbg_sstile = tileData[nTile][nl].getDbgNsTile(); int dbg_stileX = dbg_sstile % stilesX; int dbg_stileY = dbg_sstile / stilesX; int dbg_tx = nTile % dbg_tilesX; int dbg_ty = nTile / dbg_tilesX; int dbg_dx = dbg_tx - (superTileSize * dbg_stileX + superTileSize/2); int dbg_dy = dbg_ty - (superTileSize * dbg_stileY + superTileSize/2); System.out.println("Broken link: "+nTile1+ " from "+nTile+", nl="+nl+", dir = "+dir+ ", dbg_stX="+dbg_stX+", dbg_stY="+dbg_stY+", dbg_st="+dbg_st+", neibs[dir]="+neibs[dir]+ " dbg_nsTile = "+dbg_sstile +" ("+dbg_stileX+":"+dbg_stileY+")"+ " nTile="+nTile+" ("+dbg_tx+":"+dbg_ty+")"+ ", deltas from src center: "+dbg_dx+":"+dbg_dy); } // neibs[dir] = -2; // was broken link } else { // check if link is mutual int [] neibs_other = tileData[nTile1][neibs[dir]].getNeighbors(); if (neibs_other[(dir + 4) % 8] != nl){ if (debugLevel > 0) { int dbg_sstile = tileData[nTile][nl].getDbgNsTile(); int dbg_stileX = dbg_sstile % stilesX; int dbg_stileY = dbg_sstile / stilesX; int dbg_tx = nTile % dbg_tilesX; int dbg_ty = nTile / dbg_tilesX; int dbg_dx = dbg_tx - (superTileSize * dbg_stileX + superTileSize/2); int dbg_dy = dbg_ty - (superTileSize * dbg_stileY + superTileSize/2); System.out.println("Link not mutual: "+nTile1+ " from "+nTile+", nl="+nl+", dir = "+dir+ ", dbg_stX="+dbg_stX+", dbg_stY="+dbg_stY+", dbg_st="+dbg_st+", neibs[dir]="+neibs[dir]+ " dbg_nsTile = "+dbg_sstile +" ("+dbg_stileX+":"+dbg_stileY+")"+ " nTile="+nTile+" ("+dbg_tx+":"+dbg_ty+")"+ ", deltas from src center: "+dbg_dx+":"+dbg_dy+ ", neibs_other["+((dir + 4) % 8)+"]="+neibs_other[(dir + 4) % 8]+ ", dbg_nsTile other="+tileData[nTile1][neibs[dir]].getDbgNsTile()); } if (neibs_other[(dir + 4) % 8] < 0 ){ neibs_other[(dir + 4) % 8] = nl; // adding back link instead of missing one } else { int nTile2 = getNtileDir(nTile1, (dir + 4) % 8); if ( (nTile2 < 0) || (tileData[nTile2] == null) || (tileData[nTile2][neibs_other[(dir + 4) % 8]] == null)) { neibs_other[(dir + 4) % 8] = nl; // adding back link instead of broken one } } } } } } } } } } } } }; } ImageDtt.startAndJoin(threads); } public int getTileLayersNumber ( final TileData [][] tileData) { Loading Loading @@ -1279,7 +1396,6 @@ public class TileSurface { final Thread[] threads = ImageDtt.newThreadArray(threadsMax); final AtomicInteger ai = new AtomicInteger(0); final int numLayers = getTileLayersNumber(tileData); // final double [][][] disp_strength = new double [numLayers][2][tileData.length]; final int [][][] connections = new int [numLayers][tileData.length][8]; for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { Loading Loading @@ -1351,7 +1467,27 @@ public class TileSurface { debugLevel, // final int debugLevel, dbg_X, // final int dbg_X, dbg_Y); // final int dbg_Y); System.out.println("addBackShellsConnections()"); addBackShellsConnections ( tileData, // final TileData [][] tileData_src, debugLevel, // final int debugLevel, dbg_X, // final int dbg_X, dbg_Y); // final int dbg_Y); // System.out.println("checkShellsConnections()"); checkShellsConnections ( tileData, // final TileData [][] tileData_src, debugLevel, // final int debugLevel, dbg_X, // final int dbg_X, dbg_Y); // final int dbg_Y); /* System.out.println("checkShellsConnections() - 2"); checkShellsConnections ( tileData, // final TileData [][] tileData_src, debugLevel, // final int debugLevel, dbg_X, // final int dbg_X, dbg_Y); // final int dbg_Y); */ tileData = compactSortShells ( tileData, // final TileData [][] tileData_src, debugLevel, // final int debugLevel, Loading Loading
src/main/java/TileSurface.java +211 −75 Original line number Diff line number Diff line Loading @@ -449,7 +449,7 @@ public class TileSurface { double [] wnd = new double [size * size]; int indx = 0; for (int i = 0; i < size; i++){ for (int j = 0; i < size; i++){ for (int j = 0; j < size; j++){ wnd[indx++] = wnd1d[i]*wnd1d[j]; } } Loading Loading @@ -953,13 +953,6 @@ public class TileSurface { int stileY = nsTile / stilesX; int stileX = nsTile % stilesX; for (int np = 0; np < planes[nsTile].length; np++) if (planes[nsTile][np] != null){ /* int surf_number = getTileSurfaceNumber ( // maximal number of surfaces in this supertile nsTile, // int nsTile, -1, // int dir, // direction, or -1 (same) np, // 0, // int np, planes); // TilePlanes.PlaneData [][] planes) */ int [][][] src_mesh = lappingMeshes[nsTile][np]; double [][] disp_strength = fusedSupertilePlanes[nsTile][np]; TileData [] dual_mesh = new TileData [len2]; // full overlapping dual-sized mesh Loading @@ -967,28 +960,6 @@ public class TileSurface { System.out.println("createTileShells():2, *** NULL here*** nsTile = "+nsTile+" np="+np); continue; } /* int [] sNeibs = planes[nsTile][np].getNeibBest(); int [] surface_numbers = new int [8]; for (int dir = 0; dir < 8; dir++){ int nsTile1 = getNStileDir(nsTile, dir); if (sNeibs[dir] >= 0){ surface_numbers[dir] = getTileSurfaceNumber ( // maximal number of surfaces in this supertile nsTile1, // int nsTile, -1, // int dir, // direction, or -1 (same) sNeibs[dir], // int np, planes); } else if (nsTile1 >= 0){ surface_numbers[dir] = getTileSurfaceNumber ( // maximal number of surfaces in this supertile nsTile1, // int nsTile, ((dir + 4) % 8), // int dir, // direction, or -1 (same) np, // 0, // int np, planes); } else { // out of the picture surface_numbers[dir] = -1; // out of the picture } } */ for (int indx = 0 ; indx < len2; indx++){ // src_mesh non-null elements can only be generated by this supertile, while // neighbor links can point to others (connected). Loading @@ -1001,32 +972,12 @@ public class TileSurface { if (src_neibs != null){ int tsegm = tileNeibs.getSegment(indx); int nsTile0 = getNStileDir(nsTile, tsegm); // supertile over which this tile is // if ( (tsegm < 0) || // own tile (center square) // (surface_numbers[tsegm] >= 0)) { // <0 - out of picture area if ( (tsegm < 0) || // own tile (center square) (nsTile0 >= 0)) { // <0 - out of picture area dual_mesh[indx] = new TileData( // now sets neighbors to -1 disp_strength[0][indx], // disparity disp_strength[1][indx]); // strength dual_mesh[indx].setDbgNsTile(nsTile); /* if (tsegm < 0) { // own (center) dual_mesh[indx].setIndex(surf_number); } else { // dual_mesh[indx].setIndex(surface_numbers[tsegm]); // the cell is generated byh this supertile, so if the segment is outside // of the home area (tsegm >= 0), surface will be numbered as destinatination // supertile coming from this // int nsTile2 = getNStileDir(nsTile, tsegm); // negative segm 1 is OK ? int dir1from2 = getDirToStile(nsTile0, nsTile); // can be -1; int surf = getTileSurfaceNumber ( // maximal number of surfaces in this supertile nsTile0, // int nsTile, dir1from2, // int dir, // direction, or -1 (same) np, // int np, planes); dual_mesh[indx].setIndex(surf); } */ int dirThisfrom0 = getDirToStile(nsTile0, nsTile); // can be -1; int surf0 = getTileSurfaceNumber ( // Number of the surface for the tile itself nsTile0, // int nsTile, Loading @@ -1048,7 +999,6 @@ public class TileSurface { // nsTile2 - non-overlapping supertile where the destination tile belongs // Unique surface number should be determined for nsTile2, generated by nsTile1, // for direction how nsTile1 is visible from the nsTile2 // int dir1from2 = getDirToStile(nsTile2, nsTile1); // can be -1; int dir1from2 = getDirToStile(nsTile2, nsTile1); // can be -1; int surf = getTileSurfaceNumber ( // maximal number of surfaces in this supertile nsTile2, // int nsTile, Loading @@ -1064,38 +1014,16 @@ public class TileSurface { } // Now we have a double-sized surface with all tiles set with correct absolute indices, now just split it //surf_number = int sh3 = 3 * sh; for (int ty = 0; ty < ss2; ty++ ){ for (int tx = 0; tx < ss2; tx++ ){ int indx = ty * ss2 + tx; if (dual_mesh[indx] != null) { // some cells may be missing after merge int tsegm = tileNeibs.getSegment(indx); // int nsTile1 = getNStileDir(nsTile,tsegm); int ix, iy; /* switch (tsegm){ case -1 : ix = tx - sh ; iy = ty - sh ; break; case 0 : ix = tx - sh ; iy = ty + sh ; break; case 1 : ix = tx - sh3; iy = ty + sh ; break; case 2 : ix = tx - sh3; iy = ty - sh ; break; case 3 : ix = tx - sh3; iy = ty + sh3; break; case 4 : ix = tx - sh ; iy = ty + sh3; break; case 5 : ix = tx + sh ; iy = ty + sh3; break; case 6 : ix = tx + sh ; iy = ty - sh ; break; case 7 : ix = tx + sh ; iy = ty + sh ; break; default: ix = tx -sh; iy = ty -sh; } */ ix = (stileX * superTileSize) + tx -sh; iy = (stileY * superTileSize) + ty -sh; // if ((ix >= 0) && (ix < superTileSize) && (iy >= 0) && (iy < superTileSize)) { // int tindx = ((stileY * superTileSize) + iy) * tilesX + ((stileX * superTileSize) + ix); if ((ix >= 0) && (ix < tilesX) && (iy >= 0) && (iy < tilesX)) { int tindx = iy * tilesX + ix; // if () tile_data[tindx][dual_mesh[indx].getIndex()] = dual_mesh[indx]; //oob // tile_data[nsTile1][iy * superTileSize + ix][dual_mesh[indx].getIndex()] = dual_mesh[indx]; } } } Loading Loading @@ -1222,6 +1150,195 @@ public class TileSurface { return tile_data; } public void checkShellsConnections ( final TileData [][] tileData, final int debugLevel, final int dbg_X, final int dbg_Y) { final int nStiles = stilesX * stilesY; final int nTiles = nStiles * superTileSize * superTileSize; // final TileData [][] tile_data = new TileData [nTiles][]; final Thread[] threads = ImageDtt.newThreadArray(threadsMax); final AtomicInteger ai = new AtomicInteger(0); final int dbg_stile = (dbg_Y * superTileSize) * (stilesX * superTileSize) + (dbg_X * superTileSize); // final int dbg_tile = dbg_Y * stilesX + dbg_X; final int dbg_tilesX = stilesX * superTileSize; for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { public void run() { for (int nTile = ai.getAndIncrement(); nTile < nTiles; nTile = ai.getAndIncrement()) { int dbg_stX = nTile % dbg_tilesX; int dbg_stY = nTile / dbg_tilesX; int dbg_st = (dbg_stY / superTileSize) * stilesX + (dbg_stX / superTileSize); int dl = ((debugLevel > -1) && (dbg_st == dbg_stile)) ? 3:0; if (dl > 0){ System.out.println("checkShellsConnections(), nTile = "+nTile+ ", nsTile = "+dbg_st); } if (tileData[nTile] != null){ for (int nl = 0; nl < tileData[nTile].length; nl++){ if (tileData[nTile][nl] != null){ int [] neibs = tileData[nTile][nl].getNeighbors(); for (int dir = 0; dir < neibs.length; dir++){ if (neibs[dir] >= 0){ int nTile1 = getNtileDir(nTile, dir); if (nTile1 >= 0) { if ((tileData[nTile1] == null) || (tileData[nTile1][neibs[dir]] == null)){ if (debugLevel > -1) { int dbg_sstile = tileData[nTile][nl].getDbgNsTile(); int dbg_stileX = dbg_sstile % stilesX; int dbg_stileY = dbg_sstile / stilesX; int dbg_tx = nTile % dbg_tilesX; int dbg_ty = nTile / dbg_tilesX; int dbg_dx = dbg_tx - (superTileSize * dbg_stileX + superTileSize/2); int dbg_dy = dbg_ty - (superTileSize * dbg_stileY + superTileSize/2); System.out.println("Broken link: "+nTile1+ " from "+nTile+", nl="+nl+", dir = "+dir+ ", dbg_stX="+dbg_stX+", dbg_stY="+dbg_stY+", dbg_st="+dbg_st+", neibs[dir]="+neibs[dir]+ " dbg_nsTile = "+dbg_sstile +" ("+dbg_stileX+":"+dbg_stileY+")"+ " nTile="+nTile+" ("+dbg_tx+":"+dbg_ty+")"+ ", deltas from src center: "+dbg_dx+":"+dbg_dy); } neibs[dir] = -2; // was broken link } else { // check if link is mutual int [] neibs_other = tileData[nTile1][neibs[dir]].getNeighbors(); if (neibs_other[(dir + 4) % 8] != nl){ if (debugLevel > -1) { int dbg_sstile = tileData[nTile][nl].getDbgNsTile(); int dbg_stileX = dbg_sstile % stilesX; int dbg_stileY = dbg_sstile / stilesX; int dbg_tx = nTile % dbg_tilesX; int dbg_ty = nTile / dbg_tilesX; int dbg_dx = dbg_tx - (superTileSize * dbg_stileX + superTileSize/2); int dbg_dy = dbg_ty - (superTileSize * dbg_stileY + superTileSize/2); System.out.println("Link not mutual: "+nTile1+ " from "+nTile+", nl="+nl+", dir = "+dir+ ", dbg_stX="+dbg_stX+", dbg_stY="+dbg_stY+", dbg_st="+dbg_st+", neibs[dir]="+neibs[dir]+ " dbg_nsTile = "+dbg_sstile +" ("+dbg_stileX+":"+dbg_stileY+")"+ " nTile="+nTile+" ("+dbg_tx+":"+dbg_ty+")"+ ", deltas from src center: "+dbg_dx+":"+dbg_dy+ ", neibs_other["+((dir + 4) % 8)+"]="+neibs_other[(dir + 4) % 8]+ ", dbg_nsTile other="+tileData[nTile1][neibs[dir]].getDbgNsTile()); } neibs[dir] = -3; // not a mutual link (break only this side here) } } } } } } } } } } }; } ImageDtt.startAndJoin(threads); } public void addBackShellsConnections ( final TileData [][] tileData, final int debugLevel, final int dbg_X, final int dbg_Y) { final int nStiles = stilesX * stilesY; final int nTiles = nStiles * superTileSize * superTileSize; // final TileData [][] tile_data = new TileData [nTiles][]; final Thread[] threads = ImageDtt.newThreadArray(threadsMax); final AtomicInteger ai = new AtomicInteger(0); final int dbg_stile = (dbg_Y * superTileSize) * (stilesX * superTileSize) + (dbg_X * superTileSize); // final int dbg_tile = dbg_Y * stilesX + dbg_X; final int dbg_tilesX = stilesX * superTileSize; for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { public void run() { for (int nTile = ai.getAndIncrement(); nTile < nTiles; nTile = ai.getAndIncrement()) { int dbg_stX = nTile % dbg_tilesX; int dbg_stY = nTile / dbg_tilesX; int dbg_st = (dbg_stY / superTileSize) * stilesX + (dbg_stX / superTileSize); int dl = ((debugLevel > -1) && (dbg_st == dbg_stile)) ? 3:0; if (dl > 0){ System.out.println("checkShellsConnections(), nTile = "+nTile+ ", nsTile = "+dbg_st); } if (tileData[nTile] != null){ for (int nl = 0; nl < tileData[nTile].length; nl++){ if (tileData[nTile][nl] != null){ int [] neibs = tileData[nTile][nl].getNeighbors(); for (int dir = 0; dir < neibs.length; dir++){ if (neibs[dir] >= 0){ int nTile1 = getNtileDir(nTile, dir); if (nTile1 >= 0) { if ((tileData[nTile1] == null) || (tileData[nTile1][neibs[dir]] == null)){ if (debugLevel > 0) { int dbg_sstile = tileData[nTile][nl].getDbgNsTile(); int dbg_stileX = dbg_sstile % stilesX; int dbg_stileY = dbg_sstile / stilesX; int dbg_tx = nTile % dbg_tilesX; int dbg_ty = nTile / dbg_tilesX; int dbg_dx = dbg_tx - (superTileSize * dbg_stileX + superTileSize/2); int dbg_dy = dbg_ty - (superTileSize * dbg_stileY + superTileSize/2); System.out.println("Broken link: "+nTile1+ " from "+nTile+", nl="+nl+", dir = "+dir+ ", dbg_stX="+dbg_stX+", dbg_stY="+dbg_stY+", dbg_st="+dbg_st+", neibs[dir]="+neibs[dir]+ " dbg_nsTile = "+dbg_sstile +" ("+dbg_stileX+":"+dbg_stileY+")"+ " nTile="+nTile+" ("+dbg_tx+":"+dbg_ty+")"+ ", deltas from src center: "+dbg_dx+":"+dbg_dy); } // neibs[dir] = -2; // was broken link } else { // check if link is mutual int [] neibs_other = tileData[nTile1][neibs[dir]].getNeighbors(); if (neibs_other[(dir + 4) % 8] != nl){ if (debugLevel > 0) { int dbg_sstile = tileData[nTile][nl].getDbgNsTile(); int dbg_stileX = dbg_sstile % stilesX; int dbg_stileY = dbg_sstile / stilesX; int dbg_tx = nTile % dbg_tilesX; int dbg_ty = nTile / dbg_tilesX; int dbg_dx = dbg_tx - (superTileSize * dbg_stileX + superTileSize/2); int dbg_dy = dbg_ty - (superTileSize * dbg_stileY + superTileSize/2); System.out.println("Link not mutual: "+nTile1+ " from "+nTile+", nl="+nl+", dir = "+dir+ ", dbg_stX="+dbg_stX+", dbg_stY="+dbg_stY+", dbg_st="+dbg_st+", neibs[dir]="+neibs[dir]+ " dbg_nsTile = "+dbg_sstile +" ("+dbg_stileX+":"+dbg_stileY+")"+ " nTile="+nTile+" ("+dbg_tx+":"+dbg_ty+")"+ ", deltas from src center: "+dbg_dx+":"+dbg_dy+ ", neibs_other["+((dir + 4) % 8)+"]="+neibs_other[(dir + 4) % 8]+ ", dbg_nsTile other="+tileData[nTile1][neibs[dir]].getDbgNsTile()); } if (neibs_other[(dir + 4) % 8] < 0 ){ neibs_other[(dir + 4) % 8] = nl; // adding back link instead of missing one } else { int nTile2 = getNtileDir(nTile1, (dir + 4) % 8); if ( (nTile2 < 0) || (tileData[nTile2] == null) || (tileData[nTile2][neibs_other[(dir + 4) % 8]] == null)) { neibs_other[(dir + 4) % 8] = nl; // adding back link instead of broken one } } } } } } } } } } } } }; } ImageDtt.startAndJoin(threads); } public int getTileLayersNumber ( final TileData [][] tileData) { Loading Loading @@ -1279,7 +1396,6 @@ public class TileSurface { final Thread[] threads = ImageDtt.newThreadArray(threadsMax); final AtomicInteger ai = new AtomicInteger(0); final int numLayers = getTileLayersNumber(tileData); // final double [][][] disp_strength = new double [numLayers][2][tileData.length]; final int [][][] connections = new int [numLayers][tileData.length][8]; for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { Loading Loading @@ -1351,7 +1467,27 @@ public class TileSurface { debugLevel, // final int debugLevel, dbg_X, // final int dbg_X, dbg_Y); // final int dbg_Y); System.out.println("addBackShellsConnections()"); addBackShellsConnections ( tileData, // final TileData [][] tileData_src, debugLevel, // final int debugLevel, dbg_X, // final int dbg_X, dbg_Y); // final int dbg_Y); // System.out.println("checkShellsConnections()"); checkShellsConnections ( tileData, // final TileData [][] tileData_src, debugLevel, // final int debugLevel, dbg_X, // final int dbg_X, dbg_Y); // final int dbg_Y); /* System.out.println("checkShellsConnections() - 2"); checkShellsConnections ( tileData, // final TileData [][] tileData_src, debugLevel, // final int debugLevel, dbg_X, // final int dbg_X, dbg_Y); // final int dbg_Y); */ tileData = compactSortShells ( tileData, // final TileData [][] tileData_src, debugLevel, // final int debugLevel, Loading