Skip to content

Commit a555151

Browse files
committed
Clarify computation of transformed corners
1 parent 65d13ab commit a555151

File tree

1 file changed

+31
-26
lines changed

1 file changed

+31
-26
lines changed

src/main/java/net/imglib2/roi/Bounds.java

Lines changed: 31 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -846,10 +846,8 @@ private void updateMinMax( )
846846
double minCorner = transformedCorners[ 0 ][ d ];
847847
for ( int i = 1; i < numTransformedCorners; i++ )
848848
{
849-
if ( transformedCorners[ i ][ d ] < minCorner )
850-
minCorner = transformedCorners[ i ][ d ];
851-
if ( transformedCorners[ i ][ d ] > maxCorner )
852-
maxCorner = transformedCorners[ i ][ d ];
849+
minCorner = Math.min( minCorner, transformedCorners[ i ][ d ] );
850+
maxCorner = Math.max( maxCorner, transformedCorners[ i ][ d ] );
853851
}
854852
min[ d ] = minCorner;
855853
max[ d ] = maxCorner;
@@ -858,32 +856,39 @@ private void updateMinMax( )
858856

859857
private double[][] createCorners()
860858
{
861-
final int numCorners = ( int ) Math.pow( 2, numSourceDimensions );
862-
final double[][] cornersTransformed = new double[ numCorners ][ numSourceDimensions ];
863-
int s = numCorners / 2;
864-
boolean mn = false;
865-
for ( int d = 0; d < numSourceDimensions; d++ )
866-
{
867-
for ( int i = 0; i < numCorners; i++ )
868-
{
869-
if ( i % s == 0 )
870-
mn = !mn;
871-
872-
if ( mn )
873-
cornersTransformed[ i ][ d ] = cachedSourceMin[ d ];
874-
else
875-
cornersTransformed[ i ][ d ] = cachedSourceMax[ d ];
876-
}
877-
s = s / 2;
878-
}
879-
880-
final double[][] points = new double[ numCorners ][ n ];
881-
859+
final double[][] cornersTransformed = corners( cachedSourceMin, cachedSourceMax );
860+
final double[][] points = new double[ cornersTransformed.length ][ n ];
882861
for ( int i = 0; i < points.length; i++ )
883862
transformToSource.inverse().apply( cornersTransformed[ i ], points[ i ] );
884-
885863
return points;
886864
}
865+
866+
// TODO: This is similar to
867+
// https://github.com/bigdataviewer/bigdataviewer-core/blob/d6edacb661291ef5d6b78df1cd9a1b8045553052/src/main/java/bdv/tools/boundingbox/IntervalCorners.java
868+
// Would it make sense to put it into imglib2 core?
869+
// Also related to (special case of)
870+
// https://github.com/imglib/imglib2-realtransform/pull/37
871+
// https://github.com/imglib/imglib2-realtransform/issues/6
872+
/**
873+
* Compute the corners of a RealInterval given by {@code min} and {@code max}.
874+
* <p>
875+
* A n-dimensional interval has {@code 2^n} corners.
876+
* <p>
877+
* The index of a corner is interpreted as a binary number where bit 0
878+
* corresponds to X, bit 1 corresponds to Y, etc. A zero bit means min in the
879+
* corresponding dimension, a one bit means max in the corresponding dimension.
880+
*/
881+
private static double[][] corners( final double[] min, final double[] max )
882+
{
883+
assert min.length == max.length;
884+
final int n = min.length;
885+
final int numCorners = 1 << n;
886+
final double[][] corners = new double[ numCorners ][ n ];
887+
for ( int index = 0; index < numCorners; index++ )
888+
for ( int d = 0, mask = numCorners >> 1; d < n; ++d, mask >>= 1 )
889+
corners[ index ][ d ] = ( index & mask ) == 0 ? min[ d ] : max[ d ];
890+
return corners;
891+
}
887892
}
888893

889894
}

0 commit comments

Comments
 (0)