package okj.easy.math.simulation; import java.util.ArrayList; import okj.easy.core.eAdmin; import org.ege.utils.E; import com.badlogic.gdx.math.Vector2; /** * GridSimulation with a <b>"FIXED"</b> row,or column or both * @Note In the algorithm , the grid is count from 0 to N and it's grid position * depend on that counting and alse the maximun row or column * <p> such as (for landscape mode): *<b><p> * 1 3 5 7 9 <p> * 0 2 4 6 8 * @author Ngo Trong Trung *</b> */ public class GridSimulationF extends SimulationAdapter{ public static final byte TOP_LEFT = 1; public static final byte BOTTOM_LEFT = 2; // ---------------------------------------------------------- private float startX = 0; private float startY = 0; private float width = 10; private float height = 10; private int maxRows = 9; private int maxCols = 9; int divisor = 10; float padding = 0; int orientation; // ---------------------------------------------------------- public GridSimulationF(float startX,float startY,float padding,int orientation){ this.startX = startX; this.startY = startY; this.padding = padding; this.orientation = orientation; } /** * For infinite of row or column just set it to -1 : maxRows = -1 <=> maxRows = INFINITE * @param width * @param height * @param maxRows * @param maxCols */ public void setViewGrid(float width,float height,int maxRows,int maxCols){ this.width = width + padding; this.height = height + padding; this.maxCols = maxCols; this.maxRows = maxRows; } /** * unproject and return list of position depend on the number of view<p> * you can choose the 0 point at the BOTTOM_LEFT or TOP_LEFT * @param numberOfView * @param zeroPointInSytem * @return */ public Vector2[] unproject(int numberOfView,byte zeroPointInSytem){ ArrayList<Vector2> tmp = new ArrayList<Vector2>(); if(orientation == E.orientation.LANDSCAPE){ if(maxCols <= 0){ for(int i = 0;i < numberOfView;i++){ float y = startY + (height * (i % maxRows)); float x = startX + (width * ( i / maxRows)); tmp.add( new Vector2(x, y)); } }else{ int curCol = -1; boolean repeat = false; for(int i = 0; i< numberOfView;i++){ float y = startY + (height * (i % maxRows)); float x = startX + (width * (i / maxRows)); tmp.add( new Vector2(x, y)); if(i % maxRows == 0) curCol ++; if(curCol == maxCols ) repeat = true; if(repeat) return tmp.toArray(new Vector2[tmp.size()]); } } }else{ if(maxRows <= 0){ for(int i = 0;i < numberOfView;i++){ float x = startX + (width * (i % maxCols)); float y = startY + (height *(i / maxCols)); tmp.add( new Vector2(x,y)); } }else{ int curRow = -1; boolean repeat = false; for(int i = 0;i < numberOfView;i++){ float x = startX + (width * (i % maxCols)); float y = startY + (height *(i / maxCols)); tmp.add( new Vector2(x,y)); if(i % maxRows == 0) curRow ++; if(curRow == maxRows -1) repeat = true; if(repeat) return tmp.toArray(new Vector2[tmp.size()]); } } } Vector2[] test = new Vector2[tmp.size()]; tmp.toArray(test); if(zeroPointInSytem == TOP_LEFT) turnToTopLeftSystem(test); return test; } private void turnToTopLeftSystem(Vector2[] poss){ for(int i = 0;i < poss.length;i++){ poss[i].set(poss[i].x, eAdmin.gameWidth()-poss[i].y); } } @Override public int toMappingId(float xPosition, float yPosition) { float x = xPosition - startX; float y = yPosition - startY; x = x - (x % width); y = y - (y % height); if(orientation == E.orientation.LANDSCAPE){ return (int) (maxRows*(x/width+1) - (maxRows - y/height)); }else{ return (int) (maxCols*(y/height+1) - (maxCols - x/width)); } } public Vector2 toRealPos(int ID){ if(orientation == E.orientation.LANDSCAPE){ return new Vector2(startX + (width *(ID / maxRows)), startY + (height *(ID % maxRows))); }else return new Vector2(startX + (width *(ID % maxCols)), startY + (height*(ID / maxCols))); } public float getGridWidth(){ return this.width-padding; } public float getGridHeight(){ return this.height-padding; } @Deprecated public Vector2 toGridPos(int ID) { return null; } @Deprecated public int toMappingId(int row, int column) { return 0; } @Deprecated public Vector2 unproject(float column, float row) { return null; } @Deprecated public Vector2 project(float x, float y) { return null; } @Deprecated public Vector2 unproject(int row, int column) { return null; } }