avoid infinite loop in 3D and dD

This commit is contained in:
Sébastien Loriot 2017-08-08 12:12:29 +02:00
parent 78a07a0e69
commit 3f8448f280
2 changed files with 24 additions and 12 deletions

View File

@ -141,13 +141,21 @@ public:
internal::fixed_hilbert_split (m6, m8, Cmp< z, !upz> (zmed,_k)); internal::fixed_hilbert_split (m6, m8, Cmp< z, !upz> (zmed,_k));
if (m1!=m8)
sort<z, upz, upx, upy> (m0, m1, zmin, xmin, ymin, zmed, xmed, ymed); sort<z, upz, upx, upy> (m0, m1, zmin, xmin, ymin, zmed, xmed, ymed);
if (m1!=m0 || m2!=m8)
sort<y, upy, upz, upx> (m1, m2, ymin, zmed, xmin, ymed, zmax, xmed); sort<y, upy, upz, upx> (m1, m2, ymin, zmed, xmin, ymed, zmax, xmed);
if (m2!=m0 || m3!=m8)
sort<y, upy, upz, upx> (m2, m3, ymed, zmed, xmin, ymax, zmax, xmed); sort<y, upy, upz, upx> (m2, m3, ymed, zmed, xmin, ymax, zmax, xmed);
if (m3!=m0 || m4!=m8)
sort<x, upx,!upy,!upz> (m3, m4, xmin, ymax, zmed, xmed, ymed, zmin); sort<x, upx,!upy,!upz> (m3, m4, xmin, ymax, zmed, xmed, ymed, zmin);
if (m4!=m0 || m5!=m8)
sort<x, upx,!upy,!upz> (m4, m5, xmed, ymax, zmed, xmax, ymed, zmin); sort<x, upx,!upy,!upz> (m4, m5, xmed, ymax, zmed, xmax, ymed, zmin);
if (m5!=m0 || m6!=m8)
sort<y,!upy, upz,!upx> (m5, m6, ymax, zmed, xmax, ymed, zmax, xmed); sort<y,!upy, upz,!upx> (m5, m6, ymax, zmed, xmax, ymed, zmax, xmed);
if (m6!=m0 || m7!=m8)
sort<y,!upy, upz,!upx> (m6, m7, ymed, zmed, xmax, ymin, zmax, xmed); sort<y,!upy, upz,!upx> (m6, m7, ymed, zmed, xmax, ymin, zmax, xmed);
if (m7!=m0)
sort<z,!upz,!upx, upy> (m7, m8, zmed, xmax, ymin, zmin, xmed, ymed); sort<z,!upz,!upx, upy> (m7, m8, zmed, xmax, ymin, zmin, xmed, ymed);
} }

View File

@ -117,6 +117,7 @@ public:
/////////////start recursive calls /////////////start recursive calls
last_dir = (direction + _dimension -1) % _dimension; last_dir = (direction + _dimension -1) % _dimension;
// first step is special // first step is special
if (places[1]!=end)
sort( places[0], places[1], start, last_dir,cmin,cmax); sort( places[0], places[1], start, last_dir,cmin,cmax);
cmin[last_dir] = med[last_dir]; cmin[last_dir] = med[last_dir];
cmax[last_dir] = maxi[last_dir]; cmax[last_dir] = maxi[last_dir];
@ -124,11 +125,13 @@ public:
for(int i=1; i<two_to_dim-1; i +=2){ for(int i=1; i<two_to_dim-1; i +=2){
//std::cout<<i<<";"<<start[0]<<start[1]<<start[2]<<start[3]<<"/"<<dir[i+1]<<std::endl; //std::cout<<i<<";"<<start[0]<<start[1]<<start[2]<<start[3]<<"/"<<dir[i+1]<<std::endl;
if (places[i]!=begin || places[i+1]!=end)
sort( places[i ], places[i+1], start, dir[i+1],cmin,cmax); sort( places[i ], places[i+1], start, dir[i+1],cmin,cmax);
cmax[ dir[i+1] ] = (cmin[ dir[i+1]]==mini[ dir[i+1]]) cmax[ dir[i+1] ] = (cmin[ dir[i+1]]==mini[ dir[i+1]])
? maxi[ dir[i+1] ] : mini[ dir[i+1] ]; ? maxi[ dir[i+1] ] : mini[ dir[i+1] ];
cmin[ dir[i+1] ] = med[ dir[i+1] ]; cmin[ dir[i+1] ] = med[ dir[i+1] ];
if (places[i+1]!=begin || places[i+2]!=end)
sort( places[i+1], places[i+2], start, dir[i+1],cmin,cmax); sort( places[i+1], places[i+2], start, dir[i+1],cmin,cmax);
cmin[ dir[i+1] ] = cmax[ dir[i+1] ]; cmin[ dir[i+1] ] = cmax[ dir[i+1] ];
cmax[ dir[i+1] ] = med[ dir[i+1] ]; cmax[ dir[i+1] ] = med[ dir[i+1] ];
@ -139,6 +142,7 @@ public:
} }
//last step is special //last step is special
if (places[two_to_dim-1]!=begin)
sort( places[two_to_dim-1], places[two_to_dim], start, last_dir,cmin,cmax); sort( places[two_to_dim-1], places[two_to_dim], start, last_dir,cmin,cmax);
} }