@@ -846,10 +846,8 @@ private void updateMinMax( )
846
846
double minCorner = transformedCorners [ 0 ][ d ];
847
847
for ( int i = 1 ; i < numTransformedCorners ; i ++ )
848
848
{
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 ] );
853
851
}
854
852
min [ d ] = minCorner ;
855
853
max [ d ] = maxCorner ;
@@ -858,32 +856,39 @@ private void updateMinMax( )
858
856
859
857
private double [][] createCorners ()
860
858
{
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 ];
882
861
for ( int i = 0 ; i < points .length ; i ++ )
883
862
transformToSource .inverse ().apply ( cornersTransformed [ i ], points [ i ] );
884
-
885
863
return points ;
886
864
}
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
+ }
887
892
}
888
893
889
894
}
0 commit comments