diff options
| author | Jérémy Zurcher <jeremy@asynk.ch> | 2019-12-03 11:46:36 +0100 | 
|---|---|---|
| committer | Jérémy Zurcher <jeremy@asynk.ch> | 2019-12-03 11:46:36 +0100 | 
| commit | e3cd5c9c5ddba426f725a4ba6c64b59fc4db9718 (patch) | |
| tree | 9aa8976cd8f20e4ba0c1074ad5f81dbc80d0af3c /core/src/ch | |
| parent | 5b60a935ad1f82ae08c936df5e1e9b2c7c709de7 (diff) | |
| download | gdx-boardgame-e3cd5c9c5ddba426f725a4ba6c64b59fc4db9718.zip gdx-boardgame-e3cd5c9c5ddba426f725a4ba6c64b59fc4db9718.tar.gz | |
Board : implements distance for Hex and Square boards
Diffstat (limited to 'core/src/ch')
4 files changed, 74 insertions, 0 deletions
| 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; +    }  } | 
