Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
I
imagej-elphel
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
3
Issues
3
List
Board
Labels
Milestones
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
Elphel
imagej-elphel
Commits
21c0a3c4
Commit
21c0a3c4
authored
May 01, 2017
by
Andrey Filippov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
generating multi-leaf tile surfaces
parent
eabd962e
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
211 additions
and
75 deletions
+211
-75
TileSurface.java
src/main/java/TileSurface.java
+211
-75
No files found.
src/main/java/TileSurface.java
View file @
21c0a3c4
...
...
@@ -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
];
}
}
...
...
@@ -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
...
...
@@ -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).
...
...
@@ -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,
...
...
@@ -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,
...
...
@@ -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];
}
}
}
...
...
@@ -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
)
{
...
...
@@ -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
()
{
...
...
@@ -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,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment