diff options
| -rw-r--r-- | TODO.md | 7 | ||||
| -rw-r--r-- | core/src/ch/asynk/gdx/boardgame/boards/Board.java | 8 | ||||
| -rw-r--r-- | core/src/ch/asynk/gdx/boardgame/boards/HexBoard.java | 34 | ||||
| -rw-r--r-- | core/src/ch/asynk/gdx/boardgame/boards/SquareBoard.java | 16 | ||||
| -rw-r--r-- | core/src/ch/asynk/gdx/boardgame/boards/TriangleBoard.java | 16 | ||||
| -rw-r--r-- | test/src/ch/asynk/gdx/boardgame/test/BoardScreen.java | 8 | 
6 files changed, 88 insertions, 1 deletions
| @@ -2,10 +2,15 @@   - UI widgets      - list      - scrollbale vert/horiz +   - Algos -    - Distance      - Adjacents      - Line Of Sight      - Reachable Tiles ::: BFS      - Shortest Path ::: A* + + - TriangleMap +    - Distance +   - CircleMap +    - everything diff --git a/core/src/ch/asynk/gdx/boardgame/boards/Board.java b/core/src/ch/asynk/gdx/boardgame/boards/Board.java index 1037842..4043849 100644 --- a/core/src/ch/asynk/gdx/boardgame/boards/Board.java +++ b/core/src/ch/asynk/gdx/boardgame/boards/Board.java @@ -7,4 +7,12 @@ public interface Board      public int[] getAngles();      public void centerOf(int x, int y, Vector2 v);      public void toBoard(float x, float y, Vector2 v); +    public float distance(int x0, int y0, int x1, int y1, Geometry geometry); + +    enum Geometry +    { +        EUCLIDEAN, +        TAXICAB, +        TCHEBYCHEV +    }  } diff --git a/core/src/ch/asynk/gdx/boardgame/boards/HexBoard.java b/core/src/ch/asynk/gdx/boardgame/boards/HexBoard.java index c78fb77..6a409ad 100644 --- a/core/src/ch/asynk/gdx/boardgame/boards/HexBoard.java +++ b/core/src/ch/asynk/gdx/boardgame/boards/HexBoard.java @@ -144,4 +144,38 @@ public class HexBoard implements Board          v.set(col, row);      } + +    @Override public float distance(int x0, int y0, int x1, int y1, Geometry geometry) +    { +        if (geometry == Board.Geometry.EUCLIDEAN) { +            int dx = (x1 - x0); +            int dy = (y1 - y0); + +            if (dx == 0) { +                return  Math.abs(dy); +            } +            else if (dy == 0 || dx == dy) { +                return  Math.abs(dx); +            } +            float fdx = dx - dy / 2f; +            float fdy = dy * 0.86602f; +            return (float)Math.sqrt((fdx * fdx) + (fdy * fdy)); +        } else { +            int dx = Math.abs(x1 - x0); +            int dy = Math.abs(y1 - y0); +            int dz = Math.abs((x0 - y0) - (x1 - y1)); + +            if (dx > dy) { +                if (dx > dz) +                    return dx; +                else +                    return dz; +            } else { +                if (dy > dz) +                    return dy; +                else +                    return dz; +            } +        } +    }  } diff --git a/core/src/ch/asynk/gdx/boardgame/boards/SquareBoard.java b/core/src/ch/asynk/gdx/boardgame/boards/SquareBoard.java index 665d1ca..5a7d2b8 100644 --- a/core/src/ch/asynk/gdx/boardgame/boards/SquareBoard.java +++ b/core/src/ch/asynk/gdx/boardgame/boards/SquareBoard.java @@ -42,4 +42,20 @@ public class SquareBoard implements Board          v.set(col, row);      } + +    @Override public float distance(int x0, int y0, int x1, int y1, Geometry geometry) +    { +        int dx = Math.abs(x1 - x0); +        int dy = Math.abs(y1 - y0); + +        switch (geometry) { +            case EUCLIDEAN: +                return (float)Math.sqrt((dx * dx) + (dy * dy)); +            case TAXICAB: +                return dx + dy; +            case TCHEBYCHEV: +                return (dx > dy ? dx : dy); +        } +        return -1; +    }  } diff --git a/core/src/ch/asynk/gdx/boardgame/boards/TriangleBoard.java b/core/src/ch/asynk/gdx/boardgame/boards/TriangleBoard.java index 1fbd034..4be04f3 100644 --- a/core/src/ch/asynk/gdx/boardgame/boards/TriangleBoard.java +++ b/core/src/ch/asynk/gdx/boardgame/boards/TriangleBoard.java @@ -116,4 +116,20 @@ public class TriangleBoard implements Board          v.set(col, row);      } + +    @Override public float distance(int x0, int y0, int x1, int y1, Geometry geometry) +    { +        int dx = Math.abs(x1 - x0); +        int dy = Math.abs(y1 - y0); + +        switch (geometry) { +            case EUCLIDEAN: +                return 0; // FIXME +            case TAXICAB: +                return dx + dy; // move should only be allowed through the 3 sides not through de vertices +            case TCHEBYCHEV: +                return dx + dy; +        } +        return -1; +    }  } diff --git a/test/src/ch/asynk/gdx/boardgame/test/BoardScreen.java b/test/src/ch/asynk/gdx/boardgame/test/BoardScreen.java index 613fe57..85b57c9 100644 --- a/test/src/ch/asynk/gdx/boardgame/test/BoardScreen.java +++ b/test/src/ch/asynk/gdx/boardgame/test/BoardScreen.java @@ -21,6 +21,7 @@ public class BoardScreen extends AbstractScreen      {          private final Assets assets;          private final Piece panzer; +        private final Vector2 pos;          private final Vector2 v;          public Texture map;          public Board board; @@ -33,6 +34,7 @@ public class BoardScreen extends AbstractScreen          public MyBoard(final Assets assets)          {              this.assets = assets; +            this.pos = new Vector2();              this.v = new Vector2();              this.panzer = new Piece(assets.getTexture(assets.PANZER));          } @@ -45,6 +47,7 @@ public class BoardScreen extends AbstractScreen          public void reset()          { +            pos.set(0, 0);              board.centerOf(0, 0, v);              panzer.centerOn(v.x, v.y);              panzer.setRotation(Orientation.DEFAULT.r()); @@ -54,6 +57,11 @@ public class BoardScreen extends AbstractScreen          {              board.toBoard(x, y, v);              GdxBoardTest.debug("BoardScreen", String.format("touchDown [%d;%d] => [%d;%d]", (int)x, (int)y, (int)v.x, (int)v.y)); +            float d0 = board.distance((int)pos.x, (int)pos.y, (int)v.x, (int)v.y, Board.Geometry.TCHEBYCHEV); +            float d1 = board.distance((int)pos.x, (int)pos.y, (int)v.x, (int)v.y, Board.Geometry.TAXICAB); +            float d2 = board.distance((int)pos.x, (int)pos.y, (int)v.x, (int)v.y, Board.Geometry.EUCLIDEAN); +            GdxBoardTest.debug("BoardScreen", String.format("     from [%d;%d] => %d :: %d :: %f", (int)pos.x, (int)pos.y, (int)d0, (int)d1, d2)); +            pos.set(v);              board.centerOf((int)v.x, (int)v.y, v);              panzer.centerOn(v.x, v.y);              panzer.setRotation(Orientation.fromR(panzer.getRotation()).left().r()); | 
