package org.jcae.viewer3d.fd; public class GridUtil { final static int X_DIR=0; final static int Y_DIR=1; final static int Z_DIR=2; private FDProvider aFDProvider; public GridUtil(FDProvider aFDProvider){ this.aFDProvider=aFDProvider; } /* * returns the cell index of point p. * The index is ranged between 0 and gridCount-2; * The returned index is set to -1 if the point is out of the grid */ public int getXCellIndex(double p){ int[] range=new int[2]; range[0]=0; range[1]=getCellCount(X_DIR)-1; if(!checkInside(X_DIR,p)) return -1; getCell(X_DIR,range,p); return range[0]; } public int getYCellIndex(double p){ int[] range=new int[2]; range[0]=0; range[1]=getCellCount(Y_DIR)-1; if(!checkInside(Y_DIR,p)) return -1; getCell(Y_DIR,range,p); return range[0]; } public int getZCellIndex(double p){ int[] range=new int[2]; range[0]=0; range[1]=getCellCount(Z_DIR)-1; if(!checkInside(Z_DIR,p)) return -1; getCell(Z_DIR,range,p); return range[0]; } /* * Checks if the point is in the min/max interval. */ private boolean checkInside(int type,double p){ double max=getCellValue(getCellCount(type)-1,type); double min=getCellValue(0,type); return (min<=p && max>=p); } /* * Returns the cell number of the point p * the returned index is ranged between min and max-1 * where min is stored in range[0] and max in range[1] */ private void getCell(int type,int[] range,double p){ int posi=(int)Math.floor((range[0]+range[1])/2.); double posd=getCellValue(posi,type); if(p<posd) range[1]=posi; else if(p>posd) range[0]=posi; else { range[0]=posi; range[1]=posi; } if((range[1]-range[0])<=1) return; getCell(type,range,p); return; } private double getCellValue(int index,int type){ switch(type){ case X_DIR : return aFDProvider.getXGrid(index); case Y_DIR : return aFDProvider.getYGrid(index); case Z_DIR : return aFDProvider.getZGrid(index); } return 0.; } private int getCellCount(int type){ switch(type){ case X_DIR : return aFDProvider.getXGridCount(); case Y_DIR : return aFDProvider.getYGridCount(); case Z_DIR : return aFDProvider.getZGridCount(); } return 0; } }