package com.indago.iddea.model.source;
import net.imglib2.RealInterval;
import net.imglib2.RealPoint;
import net.imglib2.RealRandomAccess;
import net.imglib2.RealRandomAccessible;
import net.imglib2.type.numeric.integer.LongType;
/**
* A RealRandomAccess that procedurally generates values (iteration count)
* for the mandelbrot set.
*
* @author Tobias Pietzsch
*/
public class MandelbrotRealRandomAccessible implements RealRandomAccessible< LongType >
{
long maxIterations;
static double realCurve = 0d;
public void setRealCurve(double a)
{
if(a > 1d) realCurve = 1d;
else if(a < 0d) realCurve = 0d;
else realCurve = a;
System.out.println("realCurve = " + realCurve);
}
public double getRealCurve()
{
return realCurve;
}
public MandelbrotRealRandomAccessible()
{
maxIterations = 50;
}
public MandelbrotRealRandomAccessible( final long maxIterations )
{
this.maxIterations = maxIterations;
}
public void setMaxIterations( final long maxIterations )
{
this.maxIterations = maxIterations;
}
final static private long mandelbrot( final double re0, final double im0, final long maxIterations )
{
double re = re0;
double im = im0;
long i = 0;
for ( ; i < maxIterations; ++i )
{
final double squre = re * (re - re * realCurve) ;
final double squim = im * im;
if ( squre + squim > 4 )
break;
im = 2 * re * im + im0;
re = squre - squim + re0;
}
return i;
}
public class MandelbrotRealRandomAccess extends RealPoint implements RealRandomAccess< LongType >
{
final protected LongType t;
public MandelbrotRealRandomAccess()
{
super( 2 ); // number of dimensions is 2
t = new LongType();
}
@Override
public LongType get()
{
t.set( mandelbrot( position[ 0 ], position[ 1 ], maxIterations ) );
return t;
}
@Override
public MandelbrotRealRandomAccess copyRealRandomAccess()
{
return copy();
}
@Override
public MandelbrotRealRandomAccess copy()
{
final MandelbrotRealRandomAccess a = new MandelbrotRealRandomAccess();
a.setPosition( this );
return a;
}
}
@Override
public int numDimensions()
{
return 2;
}
@Override
public MandelbrotRealRandomAccess realRandomAccess()
{
return new MandelbrotRealRandomAccess();
}
@Override
public MandelbrotRealRandomAccess realRandomAccess( final RealInterval interval )
{
return realRandomAccess();
}
}