package com.mandelsoft.mand.movie; import com.mandelsoft.mand.MandIter; import com.mandelsoft.mand.MandelData; import com.mandelsoft.mand.MandelInfo; import com.mandelsoft.mand.PixelIterator; import java.math.BigDecimal; public class MandelAccess { private MandelData data; private MandelInfo info; private PixelIterator pi; private int[][] raster; private int rx; private int ry; public MandelAccess(MandelData data) { this.data=data; info=data.getInfo(); rx=info.getRX(); ry=info.getRY(); pi=MandIter.createPixelIterator(info); raster=data.getRaster().getRaster(); } public MandelData getMandelData() { return data; } public MandelInfo getInfo() { return data.getInfo(); } public boolean contains(BigDecimal x, BigDecimal y) { return info.contains(x, y); } public boolean containsY(BigDecimal y) { return info.containsY(y); } public boolean containsX(BigDecimal x) { return info.containsX(x); } public double getX(BigDecimal x) { return pi.getX(x); } public double getY(BigDecimal y) { return pi.getY(y); } public int getIter(int x, int y) { int i=raster[y][x]; if (i==0) return info.getLimitIt()+1; return i; } ///////////////////////////////////////////////////////////////////////// // preset ///////////////////////////////////////////////////////////////////////// private boolean xset; private BigDecimal cx; private double ix; private boolean yset; private BigDecimal cy; private double iy; public void setX(BigDecimal x) { cx=x; xset=true; } public void setY(BigDecimal y) { cy=y; yset=true; } public int getIter() { if (xset) { ix=getX(cx); xset=false; } if (yset) { iy=getY(cy); yset=false; } return getIter(ix,iy); } public int getIter(BigDecimal x, BigDecimal y) { return getIter(getX(x),getY(y)); } private int getIter(double ix, double iy) { if (ix<0) ix=0; if (ix>=rx) iy=rx-1; if (iy<0) iy=0; if (iy>=ry) iy=ry-1; int xmin=(int)Math.floor(ix); int xmax=(int)Math.ceil(ix); int ymin=(int)Math.floor(iy); int ymax=(int)Math.ceil(iy); if (xmin<0) xmin=xmax; if (xmax>=rx) xmax=xmin; if (ymin<0) ymin=ymax; if (ymax>=ry) ymax=ymin; int a00=getIter(xmin, ymin); int a01=getIter(xmin, ymax); int a10=getIter(xmax, ymin); int a11=getIter(xmax, ymax); double fx=ix-xmin; double fy=iy-ymin; int i= (int)((a11-a10-a01+a00)*fx*fy+(a01-a00)*fy+(a10-a00)*fx+a00); return i; } }