From e3cd5c9c5ddba426f725a4ba6c64b59fc4db9718 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Zurcher?= Date: Tue, 3 Dec 2019 11:46:36 +0100 Subject: Board : implements distance for Hex and Square boards --- TODO.md | 7 ++++- core/src/ch/asynk/gdx/boardgame/boards/Board.java | 8 +++++ .../ch/asynk/gdx/boardgame/boards/HexBoard.java | 34 ++++++++++++++++++++++ .../ch/asynk/gdx/boardgame/boards/SquareBoard.java | 16 ++++++++++ .../asynk/gdx/boardgame/boards/TriangleBoard.java | 16 ++++++++++ .../ch/asynk/gdx/boardgame/test/BoardScreen.java | 8 +++++ 6 files changed, 88 insertions(+), 1 deletion(-) diff --git a/TODO.md b/TODO.md index c6ae8c7..7f56bb2 100644 --- a/TODO.md +++ b/TODO.md @@ -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()); -- cgit v1.1-2-g2b99