imglib / imglib2-algorithm

Image processing algorithms for ImgLib2
http://imglib2.net/
Other
22 stars 20 forks source link

Potential bug in HyperSphereNeighborhood when used with RealViews.affine and Views.hyperSlice #67

Closed hanslovsky closed 5 years ago

hanslovsky commented 6 years ago

In this MWE (depending on imglib2-algorithm-0.9.0)

import java.util.Arrays;

import net.imglib2.Cursor;
import net.imglib2.Point;
import net.imglib2.RandomAccessible;
import net.imglib2.RandomAccessibleInterval;
import net.imglib2.RealRandomAccessible;
import net.imglib2.algorithm.neighborhood.HyperSphereNeighborhood;
import net.imglib2.algorithm.region.hypersphere.HyperSphere;
import net.imglib2.img.array.ArrayImg;
import net.imglib2.img.array.ArrayImgs;
import net.imglib2.img.basictypeaccess.array.ByteArray;
import net.imglib2.interpolation.randomaccess.NearestNeighborInterpolatorFactory;
import net.imglib2.realtransform.AffineGet;
import net.imglib2.realtransform.AffineRandomAccessible;
import net.imglib2.realtransform.AffineTransform3D;
import net.imglib2.realtransform.RealViews;
import net.imglib2.realtransform.Scale3D;
import net.imglib2.type.numeric.NumericType;
import net.imglib2.type.numeric.integer.UnsignedByteType;
import net.imglib2.view.ExtendedRandomAccessibleInterval;
import net.imglib2.view.Views;

public class HyperSphereBugMaybe
{

    public static void main( final String[] args )
    {

        final long dims[] = { 100, 200, 300 };
        final long radius = 15;
        final long[] pos = { 25, 50 };

        final ArrayImg< UnsignedByteType, ByteArray > img1 = ArrayImgs.unsignedBytes( dims );
        final ArrayImg< UnsignedByteType, ByteArray > img2 = ArrayImgs.unsignedBytes( dims );
        final RandomAccessible< UnsignedByteType > slice1 = makeSlice( img1 );
        final RandomAccessible< UnsignedByteType > slice2 = makeSlice( img2 );

        for ( Cursor< UnsignedByteType > c1 = Views.flatIterable( img1 ).cursor(), c2 = Views.flatIterable( img2 ).cursor(); c1.hasNext(); )
        {
            if ( !c1.next().valueEquals( c2.next() ) )
            {
                System.out.println( "ALREADY MISMATCH BEFORE ANYTHING HAPPENED!" );
            }
        }

        new HyperSphere<>( slice1, Point.wrap( pos ), radius ).forEach( UnsignedByteType::setOne );
        HyperSphereNeighborhood
                .< UnsignedByteType >factory()
                .create( pos, radius, slice2.randomAccess() )
                .forEach( UnsignedByteType::setOne );

        int unequalCount = 0;
        for ( Cursor< UnsignedByteType > c1 = Views.flatIterable( img1 ).cursor(), c2 = Views.flatIterable( img2 ).cursor(); c1.hasNext(); )
        {
            final UnsignedByteType v1 = c1.next();
            final UnsignedByteType v2 = c2.next();
            if ( !v1.valueEquals( v2 ) )
            {
                System.out.println( "v1=" + v1 + ", v2=" + v2 + ", c1=" + new Point( c1 ) + ", c2=" + new Point( c2 ) );
                ++unequalCount;
            }
        }
        // unequalCount != 0
        System.out.println( "count=" + unequalCount + ", sphere size=" + new HyperSphere<>( slice1, Point.wrap( pos ), radius ).size() );

        // sanity check
        final ArrayImg< UnsignedByteType, ByteArray > img3 = ArrayImgs.unsignedBytes( dims[ 0 ], dims[ 1 ] );
        final ArrayImg< UnsignedByteType, ByteArray > img4 = ArrayImgs.unsignedBytes( dims[ 0 ], dims[ 1 ] );
        new HyperSphere<>( img3, Point.wrap( pos ), radius ).forEach( UnsignedByteType::setOne );
        HyperSphereNeighborhood
                .< UnsignedByteType >factory()
                .create( pos, radius, img4.randomAccess() )
                .forEach( UnsignedByteType::setOne );
        System.out.println( "Equal? " + Arrays.equals( img3.update( null ).getCurrentStorageArray(), img4.update( null ).getCurrentStorageArray() ) );
        int nonZeroCount = 0;
        for ( final byte b : img3.update( null ).getCurrentStorageArray() )
        {
            nonZeroCount += b == 0 ? 0 : 1;
        }
        System.out.println( nonZeroCount );
    }

    private static < T extends NumericType< T > > RandomAccessible< T > makeSlice(
            final RandomAccessibleInterval< T > rai )
    {
        final ExtendedRandomAccessibleInterval< T, ? > extended1 = Views.extendZero( rai );
        final RealRandomAccessible< T > interpolated1 = Views.interpolate( extended1, new NearestNeighborInterpolatorFactory<>() );
        final AffineTransform3D transform = new AffineTransform3D().concatenate( new Scale3D( 0.5, 0.5, 0.5 ) );
        final AffineRandomAccessible< T, AffineGet > transformed = RealViews.affine( interpolated1, transform );
        return Views.hyperSlice( transformed, 2, 75l );
    }

}

I would expect img1 and img2 to be the same after iterating and writing into them to be identical but they are not (they differ in 710 places). Note that the sanity check on two plain ArrayImgs (img3 and img4) runs successfully (no difference, and both not all zeros). Output:

`count=710, sphere size=709` ``` v1=0, v2=1, c1=(0,0,0), c2=(0,0,0) v1=1, v2=0, c1=(50,70,150), c2=(50,70,150) v1=1, v2=0, c1=(40,72,150), c2=(40,72,150) v1=1, v2=0, c1=(42,72,150), c2=(42,72,150) v1=1, v2=0, c1=(44,72,150), c2=(44,72,150) v1=1, v2=0, c1=(46,72,150), c2=(46,72,150) v1=1, v2=0, c1=(48,72,150), c2=(48,72,150) v1=1, v2=0, c1=(50,72,150), c2=(50,72,150) v1=1, v2=0, c1=(52,72,150), c2=(52,72,150) v1=1, v2=0, c1=(54,72,150), c2=(54,72,150) v1=1, v2=0, c1=(56,72,150), c2=(56,72,150) v1=1, v2=0, c1=(58,72,150), c2=(58,72,150) v1=1, v2=0, c1=(60,72,150), c2=(60,72,150) v1=1, v2=0, c1=(36,74,150), c2=(36,74,150) v1=1, v2=0, c1=(38,74,150), c2=(38,74,150) v1=1, v2=0, c1=(40,74,150), c2=(40,74,150) v1=1, v2=0, c1=(42,74,150), c2=(42,74,150) v1=1, v2=0, c1=(44,74,150), c2=(44,74,150) v1=1, v2=0, c1=(46,74,150), c2=(46,74,150) v1=1, v2=0, c1=(48,74,150), c2=(48,74,150) v1=1, v2=0, c1=(50,74,150), c2=(50,74,150) v1=1, v2=0, c1=(52,74,150), c2=(52,74,150) v1=1, v2=0, c1=(54,74,150), c2=(54,74,150) v1=1, v2=0, c1=(56,74,150), c2=(56,74,150) v1=1, v2=0, c1=(58,74,150), c2=(58,74,150) v1=1, v2=0, c1=(60,74,150), c2=(60,74,150) v1=1, v2=0, c1=(62,74,150), c2=(62,74,150) v1=1, v2=0, c1=(64,74,150), c2=(64,74,150) v1=1, v2=0, c1=(32,76,150), c2=(32,76,150) v1=1, v2=0, c1=(34,76,150), c2=(34,76,150) v1=1, v2=0, c1=(36,76,150), c2=(36,76,150) v1=1, v2=0, c1=(38,76,150), c2=(38,76,150) v1=1, v2=0, c1=(40,76,150), c2=(40,76,150) v1=1, v2=0, c1=(42,76,150), c2=(42,76,150) v1=1, v2=0, c1=(44,76,150), c2=(44,76,150) v1=1, v2=0, c1=(46,76,150), c2=(46,76,150) v1=1, v2=0, c1=(48,76,150), c2=(48,76,150) v1=1, v2=0, c1=(50,76,150), c2=(50,76,150) v1=1, v2=0, c1=(52,76,150), c2=(52,76,150) v1=1, v2=0, c1=(54,76,150), c2=(54,76,150) v1=1, v2=0, c1=(56,76,150), c2=(56,76,150) v1=1, v2=0, c1=(58,76,150), c2=(58,76,150) v1=1, v2=0, c1=(60,76,150), c2=(60,76,150) v1=1, v2=0, c1=(62,76,150), c2=(62,76,150) v1=1, v2=0, c1=(64,76,150), c2=(64,76,150) v1=1, v2=0, c1=(66,76,150), c2=(66,76,150) v1=1, v2=0, c1=(68,76,150), c2=(68,76,150) v1=1, v2=0, c1=(30,78,150), c2=(30,78,150) v1=1, v2=0, c1=(32,78,150), c2=(32,78,150) v1=1, v2=0, c1=(34,78,150), c2=(34,78,150) v1=1, v2=0, c1=(36,78,150), c2=(36,78,150) v1=1, v2=0, c1=(38,78,150), c2=(38,78,150) v1=1, v2=0, c1=(40,78,150), c2=(40,78,150) v1=1, v2=0, c1=(42,78,150), c2=(42,78,150) v1=1, v2=0, c1=(44,78,150), c2=(44,78,150) v1=1, v2=0, c1=(46,78,150), c2=(46,78,150) v1=1, v2=0, c1=(48,78,150), c2=(48,78,150) v1=1, v2=0, c1=(50,78,150), c2=(50,78,150) v1=1, v2=0, c1=(52,78,150), c2=(52,78,150) v1=1, v2=0, c1=(54,78,150), c2=(54,78,150) v1=1, v2=0, c1=(56,78,150), c2=(56,78,150) v1=1, v2=0, c1=(58,78,150), c2=(58,78,150) v1=1, v2=0, c1=(60,78,150), c2=(60,78,150) v1=1, v2=0, c1=(62,78,150), c2=(62,78,150) v1=1, v2=0, c1=(64,78,150), c2=(64,78,150) v1=1, v2=0, c1=(66,78,150), c2=(66,78,150) v1=1, v2=0, c1=(68,78,150), c2=(68,78,150) v1=1, v2=0, c1=(70,78,150), c2=(70,78,150) v1=1, v2=0, c1=(28,80,150), c2=(28,80,150) v1=1, v2=0, c1=(30,80,150), c2=(30,80,150) v1=1, v2=0, c1=(32,80,150), c2=(32,80,150) v1=1, v2=0, c1=(34,80,150), c2=(34,80,150) v1=1, v2=0, c1=(36,80,150), c2=(36,80,150) v1=1, v2=0, c1=(38,80,150), c2=(38,80,150) v1=1, v2=0, c1=(40,80,150), c2=(40,80,150) v1=1, v2=0, c1=(42,80,150), c2=(42,80,150) v1=1, v2=0, c1=(44,80,150), c2=(44,80,150) v1=1, v2=0, c1=(46,80,150), c2=(46,80,150) v1=1, v2=0, c1=(48,80,150), c2=(48,80,150) v1=1, v2=0, c1=(50,80,150), c2=(50,80,150) v1=1, v2=0, c1=(52,80,150), c2=(52,80,150) v1=1, v2=0, c1=(54,80,150), c2=(54,80,150) v1=1, v2=0, c1=(56,80,150), c2=(56,80,150) v1=1, v2=0, c1=(58,80,150), c2=(58,80,150) v1=1, v2=0, c1=(60,80,150), c2=(60,80,150) v1=1, v2=0, c1=(62,80,150), c2=(62,80,150) v1=1, v2=0, c1=(64,80,150), c2=(64,80,150) v1=1, v2=0, c1=(66,80,150), c2=(66,80,150) v1=1, v2=0, c1=(68,80,150), c2=(68,80,150) v1=1, v2=0, c1=(70,80,150), c2=(70,80,150) v1=1, v2=0, c1=(72,80,150), c2=(72,80,150) v1=1, v2=0, c1=(26,82,150), c2=(26,82,150) v1=1, v2=0, c1=(28,82,150), c2=(28,82,150) v1=1, v2=0, c1=(30,82,150), c2=(30,82,150) v1=1, v2=0, c1=(32,82,150), c2=(32,82,150) v1=1, v2=0, c1=(34,82,150), c2=(34,82,150) v1=1, v2=0, c1=(36,82,150), c2=(36,82,150) v1=1, v2=0, c1=(38,82,150), c2=(38,82,150) v1=1, v2=0, c1=(40,82,150), c2=(40,82,150) v1=1, v2=0, c1=(42,82,150), c2=(42,82,150) v1=1, v2=0, c1=(44,82,150), c2=(44,82,150) v1=1, v2=0, c1=(46,82,150), c2=(46,82,150) v1=1, v2=0, c1=(48,82,150), c2=(48,82,150) v1=1, v2=0, c1=(50,82,150), c2=(50,82,150) v1=1, v2=0, c1=(52,82,150), c2=(52,82,150) v1=1, v2=0, c1=(54,82,150), c2=(54,82,150) v1=1, v2=0, c1=(56,82,150), c2=(56,82,150) v1=1, v2=0, c1=(58,82,150), c2=(58,82,150) v1=1, v2=0, c1=(60,82,150), c2=(60,82,150) v1=1, v2=0, c1=(62,82,150), c2=(62,82,150) v1=1, v2=0, c1=(64,82,150), c2=(64,82,150) v1=1, v2=0, c1=(66,82,150), c2=(66,82,150) v1=1, v2=0, c1=(68,82,150), c2=(68,82,150) v1=1, v2=0, c1=(70,82,150), c2=(70,82,150) v1=1, v2=0, c1=(72,82,150), c2=(72,82,150) v1=1, v2=0, c1=(74,82,150), c2=(74,82,150) v1=1, v2=0, c1=(26,84,150), c2=(26,84,150) v1=1, v2=0, c1=(28,84,150), c2=(28,84,150) v1=1, v2=0, c1=(30,84,150), c2=(30,84,150) v1=1, v2=0, c1=(32,84,150), c2=(32,84,150) v1=1, v2=0, c1=(34,84,150), c2=(34,84,150) v1=1, v2=0, c1=(36,84,150), c2=(36,84,150) v1=1, v2=0, c1=(38,84,150), c2=(38,84,150) v1=1, v2=0, c1=(40,84,150), c2=(40,84,150) v1=1, v2=0, c1=(42,84,150), c2=(42,84,150) v1=1, v2=0, c1=(44,84,150), c2=(44,84,150) v1=1, v2=0, c1=(46,84,150), c2=(46,84,150) v1=1, v2=0, c1=(48,84,150), c2=(48,84,150) v1=1, v2=0, c1=(50,84,150), c2=(50,84,150) v1=1, v2=0, c1=(52,84,150), c2=(52,84,150) v1=1, v2=0, c1=(54,84,150), c2=(54,84,150) v1=1, v2=0, c1=(56,84,150), c2=(56,84,150) v1=1, v2=0, c1=(58,84,150), c2=(58,84,150) v1=1, v2=0, c1=(60,84,150), c2=(60,84,150) v1=1, v2=0, c1=(62,84,150), c2=(62,84,150) v1=1, v2=0, c1=(64,84,150), c2=(64,84,150) v1=1, v2=0, c1=(66,84,150), c2=(66,84,150) v1=1, v2=0, c1=(68,84,150), c2=(68,84,150) v1=1, v2=0, c1=(70,84,150), c2=(70,84,150) v1=1, v2=0, c1=(72,84,150), c2=(72,84,150) v1=1, v2=0, c1=(74,84,150), c2=(74,84,150) v1=1, v2=0, c1=(24,86,150), c2=(24,86,150) v1=1, v2=0, c1=(26,86,150), c2=(26,86,150) v1=1, v2=0, c1=(28,86,150), c2=(28,86,150) v1=1, v2=0, c1=(30,86,150), c2=(30,86,150) v1=1, v2=0, c1=(32,86,150), c2=(32,86,150) v1=1, v2=0, c1=(34,86,150), c2=(34,86,150) v1=1, v2=0, c1=(36,86,150), c2=(36,86,150) v1=1, v2=0, c1=(38,86,150), c2=(38,86,150) v1=1, v2=0, c1=(40,86,150), c2=(40,86,150) v1=1, v2=0, c1=(42,86,150), c2=(42,86,150) v1=1, v2=0, c1=(44,86,150), c2=(44,86,150) v1=1, v2=0, c1=(46,86,150), c2=(46,86,150) v1=1, v2=0, c1=(48,86,150), c2=(48,86,150) v1=1, v2=0, c1=(50,86,150), c2=(50,86,150) v1=1, v2=0, c1=(52,86,150), c2=(52,86,150) v1=1, v2=0, c1=(54,86,150), c2=(54,86,150) v1=1, v2=0, c1=(56,86,150), c2=(56,86,150) v1=1, v2=0, c1=(58,86,150), c2=(58,86,150) v1=1, v2=0, c1=(60,86,150), c2=(60,86,150) v1=1, v2=0, c1=(62,86,150), c2=(62,86,150) v1=1, v2=0, c1=(64,86,150), c2=(64,86,150) v1=1, v2=0, c1=(66,86,150), c2=(66,86,150) v1=1, v2=0, c1=(68,86,150), c2=(68,86,150) v1=1, v2=0, c1=(70,86,150), c2=(70,86,150) v1=1, v2=0, c1=(72,86,150), c2=(72,86,150) v1=1, v2=0, c1=(74,86,150), c2=(74,86,150) v1=1, v2=0, c1=(76,86,150), c2=(76,86,150) v1=1, v2=0, c1=(24,88,150), c2=(24,88,150) v1=1, v2=0, c1=(26,88,150), c2=(26,88,150) v1=1, v2=0, c1=(28,88,150), c2=(28,88,150) v1=1, v2=0, c1=(30,88,150), c2=(30,88,150) v1=1, v2=0, c1=(32,88,150), c2=(32,88,150) v1=1, v2=0, c1=(34,88,150), c2=(34,88,150) v1=1, v2=0, c1=(36,88,150), c2=(36,88,150) v1=1, v2=0, c1=(38,88,150), c2=(38,88,150) v1=1, v2=0, c1=(40,88,150), c2=(40,88,150) v1=1, v2=0, c1=(42,88,150), c2=(42,88,150) v1=1, v2=0, c1=(44,88,150), c2=(44,88,150) v1=1, v2=0, c1=(46,88,150), c2=(46,88,150) v1=1, v2=0, c1=(48,88,150), c2=(48,88,150) v1=1, v2=0, c1=(50,88,150), c2=(50,88,150) v1=1, v2=0, c1=(52,88,150), c2=(52,88,150) v1=1, v2=0, c1=(54,88,150), c2=(54,88,150) v1=1, v2=0, c1=(56,88,150), c2=(56,88,150) v1=1, v2=0, c1=(58,88,150), c2=(58,88,150) v1=1, v2=0, c1=(60,88,150), c2=(60,88,150) v1=1, v2=0, c1=(62,88,150), c2=(62,88,150) v1=1, v2=0, c1=(64,88,150), c2=(64,88,150) v1=1, v2=0, c1=(66,88,150), c2=(66,88,150) v1=1, v2=0, c1=(68,88,150), c2=(68,88,150) v1=1, v2=0, c1=(70,88,150), c2=(70,88,150) v1=1, v2=0, c1=(72,88,150), c2=(72,88,150) v1=1, v2=0, c1=(74,88,150), c2=(74,88,150) v1=1, v2=0, c1=(76,88,150), c2=(76,88,150) v1=1, v2=0, c1=(22,90,150), c2=(22,90,150) v1=1, v2=0, c1=(24,90,150), c2=(24,90,150) v1=1, v2=0, c1=(26,90,150), c2=(26,90,150) v1=1, v2=0, c1=(28,90,150), c2=(28,90,150) v1=1, v2=0, c1=(30,90,150), c2=(30,90,150) v1=1, v2=0, c1=(32,90,150), c2=(32,90,150) v1=1, v2=0, c1=(34,90,150), c2=(34,90,150) v1=1, v2=0, c1=(36,90,150), c2=(36,90,150) v1=1, v2=0, c1=(38,90,150), c2=(38,90,150) v1=1, v2=0, c1=(40,90,150), c2=(40,90,150) v1=1, v2=0, c1=(42,90,150), c2=(42,90,150) v1=1, v2=0, c1=(44,90,150), c2=(44,90,150) v1=1, v2=0, c1=(46,90,150), c2=(46,90,150) v1=1, v2=0, c1=(48,90,150), c2=(48,90,150) v1=1, v2=0, c1=(50,90,150), c2=(50,90,150) v1=1, v2=0, c1=(52,90,150), c2=(52,90,150) v1=1, v2=0, c1=(54,90,150), c2=(54,90,150) v1=1, v2=0, c1=(56,90,150), c2=(56,90,150) v1=1, v2=0, c1=(58,90,150), c2=(58,90,150) v1=1, v2=0, c1=(60,90,150), c2=(60,90,150) v1=1, v2=0, c1=(62,90,150), c2=(62,90,150) v1=1, v2=0, c1=(64,90,150), c2=(64,90,150) v1=1, v2=0, c1=(66,90,150), c2=(66,90,150) v1=1, v2=0, c1=(68,90,150), c2=(68,90,150) v1=1, v2=0, c1=(70,90,150), c2=(70,90,150) v1=1, v2=0, c1=(72,90,150), c2=(72,90,150) v1=1, v2=0, c1=(74,90,150), c2=(74,90,150) v1=1, v2=0, c1=(76,90,150), c2=(76,90,150) v1=1, v2=0, c1=(78,90,150), c2=(78,90,150) v1=1, v2=0, c1=(22,92,150), c2=(22,92,150) v1=1, v2=0, c1=(24,92,150), c2=(24,92,150) v1=1, v2=0, c1=(26,92,150), c2=(26,92,150) v1=1, v2=0, c1=(28,92,150), c2=(28,92,150) v1=1, v2=0, c1=(30,92,150), c2=(30,92,150) v1=1, v2=0, c1=(32,92,150), c2=(32,92,150) v1=1, v2=0, c1=(34,92,150), c2=(34,92,150) v1=1, v2=0, c1=(36,92,150), c2=(36,92,150) v1=1, v2=0, c1=(38,92,150), c2=(38,92,150) v1=1, v2=0, c1=(40,92,150), c2=(40,92,150) v1=1, v2=0, c1=(42,92,150), c2=(42,92,150) v1=1, v2=0, c1=(44,92,150), c2=(44,92,150) v1=1, v2=0, c1=(46,92,150), c2=(46,92,150) v1=1, v2=0, c1=(48,92,150), c2=(48,92,150) v1=1, v2=0, c1=(50,92,150), c2=(50,92,150) v1=1, v2=0, c1=(52,92,150), c2=(52,92,150) v1=1, v2=0, c1=(54,92,150), c2=(54,92,150) v1=1, v2=0, c1=(56,92,150), c2=(56,92,150) v1=1, v2=0, c1=(58,92,150), c2=(58,92,150) v1=1, v2=0, c1=(60,92,150), c2=(60,92,150) v1=1, v2=0, c1=(62,92,150), c2=(62,92,150) v1=1, v2=0, c1=(64,92,150), c2=(64,92,150) v1=1, v2=0, c1=(66,92,150), c2=(66,92,150) v1=1, v2=0, c1=(68,92,150), c2=(68,92,150) v1=1, v2=0, c1=(70,92,150), c2=(70,92,150) v1=1, v2=0, c1=(72,92,150), c2=(72,92,150) v1=1, v2=0, c1=(74,92,150), c2=(74,92,150) v1=1, v2=0, c1=(76,92,150), c2=(76,92,150) v1=1, v2=0, c1=(78,92,150), c2=(78,92,150) v1=1, v2=0, c1=(22,94,150), c2=(22,94,150) v1=1, v2=0, c1=(24,94,150), c2=(24,94,150) v1=1, v2=0, c1=(26,94,150), c2=(26,94,150) v1=1, v2=0, c1=(28,94,150), c2=(28,94,150) v1=1, v2=0, c1=(30,94,150), c2=(30,94,150) v1=1, v2=0, c1=(32,94,150), c2=(32,94,150) v1=1, v2=0, c1=(34,94,150), c2=(34,94,150) v1=1, v2=0, c1=(36,94,150), c2=(36,94,150) v1=1, v2=0, c1=(38,94,150), c2=(38,94,150) v1=1, v2=0, c1=(40,94,150), c2=(40,94,150) v1=1, v2=0, c1=(42,94,150), c2=(42,94,150) v1=1, v2=0, c1=(44,94,150), c2=(44,94,150) v1=1, v2=0, c1=(46,94,150), c2=(46,94,150) v1=1, v2=0, c1=(48,94,150), c2=(48,94,150) v1=1, v2=0, c1=(50,94,150), c2=(50,94,150) v1=1, v2=0, c1=(52,94,150), c2=(52,94,150) v1=1, v2=0, c1=(54,94,150), c2=(54,94,150) v1=1, v2=0, c1=(56,94,150), c2=(56,94,150) v1=1, v2=0, c1=(58,94,150), c2=(58,94,150) v1=1, v2=0, c1=(60,94,150), c2=(60,94,150) v1=1, v2=0, c1=(62,94,150), c2=(62,94,150) v1=1, v2=0, c1=(64,94,150), c2=(64,94,150) v1=1, v2=0, c1=(66,94,150), c2=(66,94,150) v1=1, v2=0, c1=(68,94,150), c2=(68,94,150) v1=1, v2=0, c1=(70,94,150), c2=(70,94,150) v1=1, v2=0, c1=(72,94,150), c2=(72,94,150) v1=1, v2=0, c1=(74,94,150), c2=(74,94,150) v1=1, v2=0, c1=(76,94,150), c2=(76,94,150) v1=1, v2=0, c1=(78,94,150), c2=(78,94,150) v1=1, v2=0, c1=(22,96,150), c2=(22,96,150) v1=1, v2=0, c1=(24,96,150), c2=(24,96,150) v1=1, v2=0, c1=(26,96,150), c2=(26,96,150) v1=1, v2=0, c1=(28,96,150), c2=(28,96,150) v1=1, v2=0, c1=(30,96,150), c2=(30,96,150) v1=1, v2=0, c1=(32,96,150), c2=(32,96,150) v1=1, v2=0, c1=(34,96,150), c2=(34,96,150) v1=1, v2=0, c1=(36,96,150), c2=(36,96,150) v1=1, v2=0, c1=(38,96,150), c2=(38,96,150) v1=1, v2=0, c1=(40,96,150), c2=(40,96,150) v1=1, v2=0, c1=(42,96,150), c2=(42,96,150) v1=1, v2=0, c1=(44,96,150), c2=(44,96,150) v1=1, v2=0, c1=(46,96,150), c2=(46,96,150) v1=1, v2=0, c1=(48,96,150), c2=(48,96,150) v1=1, v2=0, c1=(50,96,150), c2=(50,96,150) v1=1, v2=0, c1=(52,96,150), c2=(52,96,150) v1=1, v2=0, c1=(54,96,150), c2=(54,96,150) v1=1, v2=0, c1=(56,96,150), c2=(56,96,150) v1=1, v2=0, c1=(58,96,150), c2=(58,96,150) v1=1, v2=0, c1=(60,96,150), c2=(60,96,150) v1=1, v2=0, c1=(62,96,150), c2=(62,96,150) v1=1, v2=0, c1=(64,96,150), c2=(64,96,150) v1=1, v2=0, c1=(66,96,150), c2=(66,96,150) v1=1, v2=0, c1=(68,96,150), c2=(68,96,150) v1=1, v2=0, c1=(70,96,150), c2=(70,96,150) v1=1, v2=0, c1=(72,96,150), c2=(72,96,150) v1=1, v2=0, c1=(74,96,150), c2=(74,96,150) v1=1, v2=0, c1=(76,96,150), c2=(76,96,150) v1=1, v2=0, c1=(78,96,150), c2=(78,96,150) v1=1, v2=0, c1=(22,98,150), c2=(22,98,150) v1=1, v2=0, c1=(24,98,150), c2=(24,98,150) v1=1, v2=0, c1=(26,98,150), c2=(26,98,150) v1=1, v2=0, c1=(28,98,150), c2=(28,98,150) v1=1, v2=0, c1=(30,98,150), c2=(30,98,150) v1=1, v2=0, c1=(32,98,150), c2=(32,98,150) v1=1, v2=0, c1=(34,98,150), c2=(34,98,150) v1=1, v2=0, c1=(36,98,150), c2=(36,98,150) v1=1, v2=0, c1=(38,98,150), c2=(38,98,150) v1=1, v2=0, c1=(40,98,150), c2=(40,98,150) v1=1, v2=0, c1=(42,98,150), c2=(42,98,150) v1=1, v2=0, c1=(44,98,150), c2=(44,98,150) v1=1, v2=0, c1=(46,98,150), c2=(46,98,150) v1=1, v2=0, c1=(48,98,150), c2=(48,98,150) v1=1, v2=0, c1=(50,98,150), c2=(50,98,150) v1=1, v2=0, c1=(52,98,150), c2=(52,98,150) v1=1, v2=0, c1=(54,98,150), c2=(54,98,150) v1=1, v2=0, c1=(56,98,150), c2=(56,98,150) v1=1, v2=0, c1=(58,98,150), c2=(58,98,150) v1=1, v2=0, c1=(60,98,150), c2=(60,98,150) v1=1, v2=0, c1=(62,98,150), c2=(62,98,150) v1=1, v2=0, c1=(64,98,150), c2=(64,98,150) v1=1, v2=0, c1=(66,98,150), c2=(66,98,150) v1=1, v2=0, c1=(68,98,150), c2=(68,98,150) v1=1, v2=0, c1=(70,98,150), c2=(70,98,150) v1=1, v2=0, c1=(72,98,150), c2=(72,98,150) v1=1, v2=0, c1=(74,98,150), c2=(74,98,150) v1=1, v2=0, c1=(76,98,150), c2=(76,98,150) v1=1, v2=0, c1=(78,98,150), c2=(78,98,150) v1=1, v2=0, c1=(20,100,150), c2=(20,100,150) v1=1, v2=0, c1=(22,100,150), c2=(22,100,150) v1=1, v2=0, c1=(24,100,150), c2=(24,100,150) v1=1, v2=0, c1=(26,100,150), c2=(26,100,150) v1=1, v2=0, c1=(28,100,150), c2=(28,100,150) v1=1, v2=0, c1=(30,100,150), c2=(30,100,150) v1=1, v2=0, c1=(32,100,150), c2=(32,100,150) v1=1, v2=0, c1=(34,100,150), c2=(34,100,150) v1=1, v2=0, c1=(36,100,150), c2=(36,100,150) v1=1, v2=0, c1=(38,100,150), c2=(38,100,150) v1=1, v2=0, c1=(40,100,150), c2=(40,100,150) v1=1, v2=0, c1=(42,100,150), c2=(42,100,150) v1=1, v2=0, c1=(44,100,150), c2=(44,100,150) v1=1, v2=0, c1=(46,100,150), c2=(46,100,150) v1=1, v2=0, c1=(48,100,150), c2=(48,100,150) v1=1, v2=0, c1=(50,100,150), c2=(50,100,150) v1=1, v2=0, c1=(52,100,150), c2=(52,100,150) v1=1, v2=0, c1=(54,100,150), c2=(54,100,150) v1=1, v2=0, c1=(56,100,150), c2=(56,100,150) v1=1, v2=0, c1=(58,100,150), c2=(58,100,150) v1=1, v2=0, c1=(60,100,150), c2=(60,100,150) v1=1, v2=0, c1=(62,100,150), c2=(62,100,150) v1=1, v2=0, c1=(64,100,150), c2=(64,100,150) v1=1, v2=0, c1=(66,100,150), c2=(66,100,150) v1=1, v2=0, c1=(68,100,150), c2=(68,100,150) v1=1, v2=0, c1=(70,100,150), c2=(70,100,150) v1=1, v2=0, c1=(72,100,150), c2=(72,100,150) v1=1, v2=0, c1=(74,100,150), c2=(74,100,150) v1=1, v2=0, c1=(76,100,150), c2=(76,100,150) v1=1, v2=0, c1=(78,100,150), c2=(78,100,150) v1=1, v2=0, c1=(80,100,150), c2=(80,100,150) v1=1, v2=0, c1=(22,102,150), c2=(22,102,150) v1=1, v2=0, c1=(24,102,150), c2=(24,102,150) v1=1, v2=0, c1=(26,102,150), c2=(26,102,150) v1=1, v2=0, c1=(28,102,150), c2=(28,102,150) v1=1, v2=0, c1=(30,102,150), c2=(30,102,150) v1=1, v2=0, c1=(32,102,150), c2=(32,102,150) v1=1, v2=0, c1=(34,102,150), c2=(34,102,150) v1=1, v2=0, c1=(36,102,150), c2=(36,102,150) v1=1, v2=0, c1=(38,102,150), c2=(38,102,150) v1=1, v2=0, c1=(40,102,150), c2=(40,102,150) v1=1, v2=0, c1=(42,102,150), c2=(42,102,150) v1=1, v2=0, c1=(44,102,150), c2=(44,102,150) v1=1, v2=0, c1=(46,102,150), c2=(46,102,150) v1=1, v2=0, c1=(48,102,150), c2=(48,102,150) v1=1, v2=0, c1=(50,102,150), c2=(50,102,150) v1=1, v2=0, c1=(52,102,150), c2=(52,102,150) v1=1, v2=0, c1=(54,102,150), c2=(54,102,150) v1=1, v2=0, c1=(56,102,150), c2=(56,102,150) v1=1, v2=0, c1=(58,102,150), c2=(58,102,150) v1=1, v2=0, c1=(60,102,150), c2=(60,102,150) v1=1, v2=0, c1=(62,102,150), c2=(62,102,150) v1=1, v2=0, c1=(64,102,150), c2=(64,102,150) v1=1, v2=0, c1=(66,102,150), c2=(66,102,150) v1=1, v2=0, c1=(68,102,150), c2=(68,102,150) v1=1, v2=0, c1=(70,102,150), c2=(70,102,150) v1=1, v2=0, c1=(72,102,150), c2=(72,102,150) v1=1, v2=0, c1=(74,102,150), c2=(74,102,150) v1=1, v2=0, c1=(76,102,150), c2=(76,102,150) v1=1, v2=0, c1=(78,102,150), c2=(78,102,150) v1=1, v2=0, c1=(22,104,150), c2=(22,104,150) v1=1, v2=0, c1=(24,104,150), c2=(24,104,150) v1=1, v2=0, c1=(26,104,150), c2=(26,104,150) v1=1, v2=0, c1=(28,104,150), c2=(28,104,150) v1=1, v2=0, c1=(30,104,150), c2=(30,104,150) v1=1, v2=0, c1=(32,104,150), c2=(32,104,150) v1=1, v2=0, c1=(34,104,150), c2=(34,104,150) v1=1, v2=0, c1=(36,104,150), c2=(36,104,150) v1=1, v2=0, c1=(38,104,150), c2=(38,104,150) v1=1, v2=0, c1=(40,104,150), c2=(40,104,150) v1=1, v2=0, c1=(42,104,150), c2=(42,104,150) v1=1, v2=0, c1=(44,104,150), c2=(44,104,150) v1=1, v2=0, c1=(46,104,150), c2=(46,104,150) v1=1, v2=0, c1=(48,104,150), c2=(48,104,150) v1=1, v2=0, c1=(50,104,150), c2=(50,104,150) v1=1, v2=0, c1=(52,104,150), c2=(52,104,150) v1=1, v2=0, c1=(54,104,150), c2=(54,104,150) v1=1, v2=0, c1=(56,104,150), c2=(56,104,150) v1=1, v2=0, c1=(58,104,150), c2=(58,104,150) v1=1, v2=0, c1=(60,104,150), c2=(60,104,150) v1=1, v2=0, c1=(62,104,150), c2=(62,104,150) v1=1, v2=0, c1=(64,104,150), c2=(64,104,150) v1=1, v2=0, c1=(66,104,150), c2=(66,104,150) v1=1, v2=0, c1=(68,104,150), c2=(68,104,150) v1=1, v2=0, c1=(70,104,150), c2=(70,104,150) v1=1, v2=0, c1=(72,104,150), c2=(72,104,150) v1=1, v2=0, c1=(74,104,150), c2=(74,104,150) v1=1, v2=0, c1=(76,104,150), c2=(76,104,150) v1=1, v2=0, c1=(78,104,150), c2=(78,104,150) v1=1, v2=0, c1=(22,106,150), c2=(22,106,150) v1=1, v2=0, c1=(24,106,150), c2=(24,106,150) v1=1, v2=0, c1=(26,106,150), c2=(26,106,150) v1=1, v2=0, c1=(28,106,150), c2=(28,106,150) v1=1, v2=0, c1=(30,106,150), c2=(30,106,150) v1=1, v2=0, c1=(32,106,150), c2=(32,106,150) v1=1, v2=0, c1=(34,106,150), c2=(34,106,150) v1=1, v2=0, c1=(36,106,150), c2=(36,106,150) v1=1, v2=0, c1=(38,106,150), c2=(38,106,150) v1=1, v2=0, c1=(40,106,150), c2=(40,106,150) v1=1, v2=0, c1=(42,106,150), c2=(42,106,150) v1=1, v2=0, c1=(44,106,150), c2=(44,106,150) v1=1, v2=0, c1=(46,106,150), c2=(46,106,150) v1=1, v2=0, c1=(48,106,150), c2=(48,106,150) v1=1, v2=0, c1=(50,106,150), c2=(50,106,150) v1=1, v2=0, c1=(52,106,150), c2=(52,106,150) v1=1, v2=0, c1=(54,106,150), c2=(54,106,150) v1=1, v2=0, c1=(56,106,150), c2=(56,106,150) v1=1, v2=0, c1=(58,106,150), c2=(58,106,150) v1=1, v2=0, c1=(60,106,150), c2=(60,106,150) v1=1, v2=0, c1=(62,106,150), c2=(62,106,150) v1=1, v2=0, c1=(64,106,150), c2=(64,106,150) v1=1, v2=0, c1=(66,106,150), c2=(66,106,150) v1=1, v2=0, c1=(68,106,150), c2=(68,106,150) v1=1, v2=0, c1=(70,106,150), c2=(70,106,150) v1=1, v2=0, c1=(72,106,150), c2=(72,106,150) v1=1, v2=0, c1=(74,106,150), c2=(74,106,150) v1=1, v2=0, c1=(76,106,150), c2=(76,106,150) v1=1, v2=0, c1=(78,106,150), c2=(78,106,150) v1=1, v2=0, c1=(22,108,150), c2=(22,108,150) v1=1, v2=0, c1=(24,108,150), c2=(24,108,150) v1=1, v2=0, c1=(26,108,150), c2=(26,108,150) v1=1, v2=0, c1=(28,108,150), c2=(28,108,150) v1=1, v2=0, c1=(30,108,150), c2=(30,108,150) v1=1, v2=0, c1=(32,108,150), c2=(32,108,150) v1=1, v2=0, c1=(34,108,150), c2=(34,108,150) v1=1, v2=0, c1=(36,108,150), c2=(36,108,150) v1=1, v2=0, c1=(38,108,150), c2=(38,108,150) v1=1, v2=0, c1=(40,108,150), c2=(40,108,150) v1=1, v2=0, c1=(42,108,150), c2=(42,108,150) v1=1, v2=0, c1=(44,108,150), c2=(44,108,150) v1=1, v2=0, c1=(46,108,150), c2=(46,108,150) v1=1, v2=0, c1=(48,108,150), c2=(48,108,150) v1=1, v2=0, c1=(50,108,150), c2=(50,108,150) v1=1, v2=0, c1=(52,108,150), c2=(52,108,150) v1=1, v2=0, c1=(54,108,150), c2=(54,108,150) v1=1, v2=0, c1=(56,108,150), c2=(56,108,150) v1=1, v2=0, c1=(58,108,150), c2=(58,108,150) v1=1, v2=0, c1=(60,108,150), c2=(60,108,150) v1=1, v2=0, c1=(62,108,150), c2=(62,108,150) v1=1, v2=0, c1=(64,108,150), c2=(64,108,150) v1=1, v2=0, c1=(66,108,150), c2=(66,108,150) v1=1, v2=0, c1=(68,108,150), c2=(68,108,150) v1=1, v2=0, c1=(70,108,150), c2=(70,108,150) v1=1, v2=0, c1=(72,108,150), c2=(72,108,150) v1=1, v2=0, c1=(74,108,150), c2=(74,108,150) v1=1, v2=0, c1=(76,108,150), c2=(76,108,150) v1=1, v2=0, c1=(78,108,150), c2=(78,108,150) v1=1, v2=0, c1=(22,110,150), c2=(22,110,150) v1=1, v2=0, c1=(24,110,150), c2=(24,110,150) v1=1, v2=0, c1=(26,110,150), c2=(26,110,150) v1=1, v2=0, c1=(28,110,150), c2=(28,110,150) v1=1, v2=0, c1=(30,110,150), c2=(30,110,150) v1=1, v2=0, c1=(32,110,150), c2=(32,110,150) v1=1, v2=0, c1=(34,110,150), c2=(34,110,150) v1=1, v2=0, c1=(36,110,150), c2=(36,110,150) v1=1, v2=0, c1=(38,110,150), c2=(38,110,150) v1=1, v2=0, c1=(40,110,150), c2=(40,110,150) v1=1, v2=0, c1=(42,110,150), c2=(42,110,150) v1=1, v2=0, c1=(44,110,150), c2=(44,110,150) v1=1, v2=0, c1=(46,110,150), c2=(46,110,150) v1=1, v2=0, c1=(48,110,150), c2=(48,110,150) v1=1, v2=0, c1=(50,110,150), c2=(50,110,150) v1=1, v2=0, c1=(52,110,150), c2=(52,110,150) v1=1, v2=0, c1=(54,110,150), c2=(54,110,150) v1=1, v2=0, c1=(56,110,150), c2=(56,110,150) v1=1, v2=0, c1=(58,110,150), c2=(58,110,150) v1=1, v2=0, c1=(60,110,150), c2=(60,110,150) v1=1, v2=0, c1=(62,110,150), c2=(62,110,150) v1=1, v2=0, c1=(64,110,150), c2=(64,110,150) v1=1, v2=0, c1=(66,110,150), c2=(66,110,150) v1=1, v2=0, c1=(68,110,150), c2=(68,110,150) v1=1, v2=0, c1=(70,110,150), c2=(70,110,150) v1=1, v2=0, c1=(72,110,150), c2=(72,110,150) v1=1, v2=0, c1=(74,110,150), c2=(74,110,150) v1=1, v2=0, c1=(76,110,150), c2=(76,110,150) v1=1, v2=0, c1=(78,110,150), c2=(78,110,150) v1=1, v2=0, c1=(24,112,150), c2=(24,112,150) v1=1, v2=0, c1=(26,112,150), c2=(26,112,150) v1=1, v2=0, c1=(28,112,150), c2=(28,112,150) v1=1, v2=0, c1=(30,112,150), c2=(30,112,150) v1=1, v2=0, c1=(32,112,150), c2=(32,112,150) v1=1, v2=0, c1=(34,112,150), c2=(34,112,150) v1=1, v2=0, c1=(36,112,150), c2=(36,112,150) v1=1, v2=0, c1=(38,112,150), c2=(38,112,150) v1=1, v2=0, c1=(40,112,150), c2=(40,112,150) v1=1, v2=0, c1=(42,112,150), c2=(42,112,150) v1=1, v2=0, c1=(44,112,150), c2=(44,112,150) v1=1, v2=0, c1=(46,112,150), c2=(46,112,150) v1=1, v2=0, c1=(48,112,150), c2=(48,112,150) v1=1, v2=0, c1=(50,112,150), c2=(50,112,150) v1=1, v2=0, c1=(52,112,150), c2=(52,112,150) v1=1, v2=0, c1=(54,112,150), c2=(54,112,150) v1=1, v2=0, c1=(56,112,150), c2=(56,112,150) v1=1, v2=0, c1=(58,112,150), c2=(58,112,150) v1=1, v2=0, c1=(60,112,150), c2=(60,112,150) v1=1, v2=0, c1=(62,112,150), c2=(62,112,150) v1=1, v2=0, c1=(64,112,150), c2=(64,112,150) v1=1, v2=0, c1=(66,112,150), c2=(66,112,150) v1=1, v2=0, c1=(68,112,150), c2=(68,112,150) v1=1, v2=0, c1=(70,112,150), c2=(70,112,150) v1=1, v2=0, c1=(72,112,150), c2=(72,112,150) v1=1, v2=0, c1=(74,112,150), c2=(74,112,150) v1=1, v2=0, c1=(76,112,150), c2=(76,112,150) v1=1, v2=0, c1=(24,114,150), c2=(24,114,150) v1=1, v2=0, c1=(26,114,150), c2=(26,114,150) v1=1, v2=0, c1=(28,114,150), c2=(28,114,150) v1=1, v2=0, c1=(30,114,150), c2=(30,114,150) v1=1, v2=0, c1=(32,114,150), c2=(32,114,150) v1=1, v2=0, c1=(34,114,150), c2=(34,114,150) v1=1, v2=0, c1=(36,114,150), c2=(36,114,150) v1=1, v2=0, c1=(38,114,150), c2=(38,114,150) v1=1, v2=0, c1=(40,114,150), c2=(40,114,150) v1=1, v2=0, c1=(42,114,150), c2=(42,114,150) v1=1, v2=0, c1=(44,114,150), c2=(44,114,150) v1=1, v2=0, c1=(46,114,150), c2=(46,114,150) v1=1, v2=0, c1=(48,114,150), c2=(48,114,150) v1=1, v2=0, c1=(50,114,150), c2=(50,114,150) v1=1, v2=0, c1=(52,114,150), c2=(52,114,150) v1=1, v2=0, c1=(54,114,150), c2=(54,114,150) v1=1, v2=0, c1=(56,114,150), c2=(56,114,150) v1=1, v2=0, c1=(58,114,150), c2=(58,114,150) v1=1, v2=0, c1=(60,114,150), c2=(60,114,150) v1=1, v2=0, c1=(62,114,150), c2=(62,114,150) v1=1, v2=0, c1=(64,114,150), c2=(64,114,150) v1=1, v2=0, c1=(66,114,150), c2=(66,114,150) v1=1, v2=0, c1=(68,114,150), c2=(68,114,150) v1=1, v2=0, c1=(70,114,150), c2=(70,114,150) v1=1, v2=0, c1=(72,114,150), c2=(72,114,150) v1=1, v2=0, c1=(74,114,150), c2=(74,114,150) v1=1, v2=0, c1=(76,114,150), c2=(76,114,150) v1=1, v2=0, c1=(26,116,150), c2=(26,116,150) v1=1, v2=0, c1=(28,116,150), c2=(28,116,150) v1=1, v2=0, c1=(30,116,150), c2=(30,116,150) v1=1, v2=0, c1=(32,116,150), c2=(32,116,150) v1=1, v2=0, c1=(34,116,150), c2=(34,116,150) v1=1, v2=0, c1=(36,116,150), c2=(36,116,150) v1=1, v2=0, c1=(38,116,150), c2=(38,116,150) v1=1, v2=0, c1=(40,116,150), c2=(40,116,150) v1=1, v2=0, c1=(42,116,150), c2=(42,116,150) v1=1, v2=0, c1=(44,116,150), c2=(44,116,150) v1=1, v2=0, c1=(46,116,150), c2=(46,116,150) v1=1, v2=0, c1=(48,116,150), c2=(48,116,150) v1=1, v2=0, c1=(50,116,150), c2=(50,116,150) v1=1, v2=0, c1=(52,116,150), c2=(52,116,150) v1=1, v2=0, c1=(54,116,150), c2=(54,116,150) v1=1, v2=0, c1=(56,116,150), c2=(56,116,150) v1=1, v2=0, c1=(58,116,150), c2=(58,116,150) v1=1, v2=0, c1=(60,116,150), c2=(60,116,150) v1=1, v2=0, c1=(62,116,150), c2=(62,116,150) v1=1, v2=0, c1=(64,116,150), c2=(64,116,150) v1=1, v2=0, c1=(66,116,150), c2=(66,116,150) v1=1, v2=0, c1=(68,116,150), c2=(68,116,150) v1=1, v2=0, c1=(70,116,150), c2=(70,116,150) v1=1, v2=0, c1=(72,116,150), c2=(72,116,150) v1=1, v2=0, c1=(74,116,150), c2=(74,116,150) v1=1, v2=0, c1=(26,118,150), c2=(26,118,150) v1=1, v2=0, c1=(28,118,150), c2=(28,118,150) v1=1, v2=0, c1=(30,118,150), c2=(30,118,150) v1=1, v2=0, c1=(32,118,150), c2=(32,118,150) v1=1, v2=0, c1=(34,118,150), c2=(34,118,150) v1=1, v2=0, c1=(36,118,150), c2=(36,118,150) v1=1, v2=0, c1=(38,118,150), c2=(38,118,150) v1=1, v2=0, c1=(40,118,150), c2=(40,118,150) v1=1, v2=0, c1=(42,118,150), c2=(42,118,150) v1=1, v2=0, c1=(44,118,150), c2=(44,118,150) v1=1, v2=0, c1=(46,118,150), c2=(46,118,150) v1=1, v2=0, c1=(48,118,150), c2=(48,118,150) v1=1, v2=0, c1=(50,118,150), c2=(50,118,150) v1=1, v2=0, c1=(52,118,150), c2=(52,118,150) v1=1, v2=0, c1=(54,118,150), c2=(54,118,150) v1=1, v2=0, c1=(56,118,150), c2=(56,118,150) v1=1, v2=0, c1=(58,118,150), c2=(58,118,150) v1=1, v2=0, c1=(60,118,150), c2=(60,118,150) v1=1, v2=0, c1=(62,118,150), c2=(62,118,150) v1=1, v2=0, c1=(64,118,150), c2=(64,118,150) v1=1, v2=0, c1=(66,118,150), c2=(66,118,150) v1=1, v2=0, c1=(68,118,150), c2=(68,118,150) v1=1, v2=0, c1=(70,118,150), c2=(70,118,150) v1=1, v2=0, c1=(72,118,150), c2=(72,118,150) v1=1, v2=0, c1=(74,118,150), c2=(74,118,150) v1=1, v2=0, c1=(28,120,150), c2=(28,120,150) v1=1, v2=0, c1=(30,120,150), c2=(30,120,150) v1=1, v2=0, c1=(32,120,150), c2=(32,120,150) v1=1, v2=0, c1=(34,120,150), c2=(34,120,150) v1=1, v2=0, c1=(36,120,150), c2=(36,120,150) v1=1, v2=0, c1=(38,120,150), c2=(38,120,150) v1=1, v2=0, c1=(40,120,150), c2=(40,120,150) v1=1, v2=0, c1=(42,120,150), c2=(42,120,150) v1=1, v2=0, c1=(44,120,150), c2=(44,120,150) v1=1, v2=0, c1=(46,120,150), c2=(46,120,150) v1=1, v2=0, c1=(48,120,150), c2=(48,120,150) v1=1, v2=0, c1=(50,120,150), c2=(50,120,150) v1=1, v2=0, c1=(52,120,150), c2=(52,120,150) v1=1, v2=0, c1=(54,120,150), c2=(54,120,150) v1=1, v2=0, c1=(56,120,150), c2=(56,120,150) v1=1, v2=0, c1=(58,120,150), c2=(58,120,150) v1=1, v2=0, c1=(60,120,150), c2=(60,120,150) v1=1, v2=0, c1=(62,120,150), c2=(62,120,150) v1=1, v2=0, c1=(64,120,150), c2=(64,120,150) v1=1, v2=0, c1=(66,120,150), c2=(66,120,150) v1=1, v2=0, c1=(68,120,150), c2=(68,120,150) v1=1, v2=0, c1=(70,120,150), c2=(70,120,150) v1=1, v2=0, c1=(72,120,150), c2=(72,120,150) v1=1, v2=0, c1=(30,122,150), c2=(30,122,150) v1=1, v2=0, c1=(32,122,150), c2=(32,122,150) v1=1, v2=0, c1=(34,122,150), c2=(34,122,150) v1=1, v2=0, c1=(36,122,150), c2=(36,122,150) v1=1, v2=0, c1=(38,122,150), c2=(38,122,150) v1=1, v2=0, c1=(40,122,150), c2=(40,122,150) v1=1, v2=0, c1=(42,122,150), c2=(42,122,150) v1=1, v2=0, c1=(44,122,150), c2=(44,122,150) v1=1, v2=0, c1=(46,122,150), c2=(46,122,150) v1=1, v2=0, c1=(48,122,150), c2=(48,122,150) v1=1, v2=0, c1=(50,122,150), c2=(50,122,150) v1=1, v2=0, c1=(52,122,150), c2=(52,122,150) v1=1, v2=0, c1=(54,122,150), c2=(54,122,150) v1=1, v2=0, c1=(56,122,150), c2=(56,122,150) v1=1, v2=0, c1=(58,122,150), c2=(58,122,150) v1=1, v2=0, c1=(60,122,150), c2=(60,122,150) v1=1, v2=0, c1=(62,122,150), c2=(62,122,150) v1=1, v2=0, c1=(64,122,150), c2=(64,122,150) v1=1, v2=0, c1=(66,122,150), c2=(66,122,150) v1=1, v2=0, c1=(68,122,150), c2=(68,122,150) v1=1, v2=0, c1=(70,122,150), c2=(70,122,150) v1=1, v2=0, c1=(32,124,150), c2=(32,124,150) v1=1, v2=0, c1=(34,124,150), c2=(34,124,150) v1=1, v2=0, c1=(36,124,150), c2=(36,124,150) v1=1, v2=0, c1=(38,124,150), c2=(38,124,150) v1=1, v2=0, c1=(40,124,150), c2=(40,124,150) v1=1, v2=0, c1=(42,124,150), c2=(42,124,150) v1=1, v2=0, c1=(44,124,150), c2=(44,124,150) v1=1, v2=0, c1=(46,124,150), c2=(46,124,150) v1=1, v2=0, c1=(48,124,150), c2=(48,124,150) v1=1, v2=0, c1=(50,124,150), c2=(50,124,150) v1=1, v2=0, c1=(52,124,150), c2=(52,124,150) v1=1, v2=0, c1=(54,124,150), c2=(54,124,150) v1=1, v2=0, c1=(56,124,150), c2=(56,124,150) v1=1, v2=0, c1=(58,124,150), c2=(58,124,150) v1=1, v2=0, c1=(60,124,150), c2=(60,124,150) v1=1, v2=0, c1=(62,124,150), c2=(62,124,150) v1=1, v2=0, c1=(64,124,150), c2=(64,124,150) v1=1, v2=0, c1=(66,124,150), c2=(66,124,150) v1=1, v2=0, c1=(68,124,150), c2=(68,124,150) v1=1, v2=0, c1=(36,126,150), c2=(36,126,150) v1=1, v2=0, c1=(38,126,150), c2=(38,126,150) v1=1, v2=0, c1=(40,126,150), c2=(40,126,150) v1=1, v2=0, c1=(42,126,150), c2=(42,126,150) v1=1, v2=0, c1=(44,126,150), c2=(44,126,150) v1=1, v2=0, c1=(46,126,150), c2=(46,126,150) v1=1, v2=0, c1=(48,126,150), c2=(48,126,150) v1=1, v2=0, c1=(50,126,150), c2=(50,126,150) v1=1, v2=0, c1=(52,126,150), c2=(52,126,150) v1=1, v2=0, c1=(54,126,150), c2=(54,126,150) v1=1, v2=0, c1=(56,126,150), c2=(56,126,150) v1=1, v2=0, c1=(58,126,150), c2=(58,126,150) v1=1, v2=0, c1=(60,126,150), c2=(60,126,150) v1=1, v2=0, c1=(62,126,150), c2=(62,126,150) v1=1, v2=0, c1=(64,126,150), c2=(64,126,150) v1=1, v2=0, c1=(40,128,150), c2=(40,128,150) v1=1, v2=0, c1=(42,128,150), c2=(42,128,150) v1=1, v2=0, c1=(44,128,150), c2=(44,128,150) v1=1, v2=0, c1=(46,128,150), c2=(46,128,150) v1=1, v2=0, c1=(48,128,150), c2=(48,128,150) v1=1, v2=0, c1=(50,128,150), c2=(50,128,150) v1=1, v2=0, c1=(52,128,150), c2=(52,128,150) v1=1, v2=0, c1=(54,128,150), c2=(54,128,150) v1=1, v2=0, c1=(56,128,150), c2=(56,128,150) v1=1, v2=0, c1=(58,128,150), c2=(58,128,150) v1=1, v2=0, c1=(60,128,150), c2=(60,128,150) v1=1, v2=0, c1=(50,130,150), c2=(50,130,150) count=710, sphere size=709 Equal? true 709 ```
hanslovsky commented 6 years ago

See 0386b6c for a (failing) test case

acardona commented 5 years ago

Would be good to resolve this issue soon, as measurements are a practical aspect that will be relevant for the upcoming ImageJ & friends conference in Heidelberg this December 2018.

tinevez commented 5 years ago

Euh wait @hanslovsky So this MVE showsthat HyperSphere and HyperSphereShape implementations differ. But this does not qualify as a bug right? There is no contract that states that the two should iterate exactly the same pixels?

hanslovsky commented 5 years ago

@tinevez that is not what this MWE shows. It shows, that

tinevez commented 5 years ago

Ah sorry.

tpietzsch commented 5 years ago

I bet this is down to rounding errors, because makeSlice shifts by exactly 0.5 pixels. I think a difference of how randomaccesses are moved (using setPosition vs move, dimension-wise, vs all dimensions, etc.) can provoke this.

To verify this, could you do a shift by 0.1 pixels instead?

If this turns out to be the reason, then I don't think this is a problem that needs to be fixed.

tpietzsch commented 5 years ago

ahm just saw that it's a scale, not at shift... but might be still the same problem

hanslovsky commented 5 years ago

When I set the scale to [1.0, 1.0, 1.0], I still observe the same behavior. For [0.1, 0.2, 0.3], the results differ in only one pixel, probably because the center of the sphere lies far into the extension of the original images.

tpietzsch commented 5 years ago

Found it. Pushing a fix now.

hanslovsky commented 5 years ago

That was quick, thank you @tpietzsch ! I remember looking at the code for a while, but I never looked at the interpolator.

axtimwalde commented 5 years ago

Ouch! Sorry and thanks a lot!