diff --git a/src/main/java/view/GridCanvas.java b/src/main/java/view/GridCanvas.java index 6d77b27b76a13fc531ca3ab3672bd754191f932a..914ac364ea2797f57839cff62a02bd1d1efaeb21 100644 --- a/src/main/java/view/GridCanvas.java +++ b/src/main/java/view/GridCanvas.java @@ -13,7 +13,7 @@ public class GridCanvas extends Canvas { private final double tileHeight; private final Integer numberOfColumns; private final Integer numberOfRows; - private final Grid tileGrid; + private final Grid grid; private final GraphicsContext graphicsContext; public GridCanvas(@NamedArg("tileWidth") Double tileWidth, @@ -26,7 +26,7 @@ public class GridCanvas extends Canvas { this.numberOfRows = numberOfRows; this.setWidth(tileWidth * numberOfColumns); this.setHeight(tileHeight * numberOfRows); - tileGrid = new ArrayGrid(numberOfRows, numberOfColumns); + grid = new ArrayGrid(numberOfRows, numberOfColumns); graphicsContext = getGraphicsContext2D(); } @@ -36,7 +36,7 @@ public class GridCanvas extends Canvas { } private void drawGrid(){ - drawGridTile(tileGrid); + draw(grid); } private void clear(){ @@ -44,35 +44,76 @@ public class GridCanvas extends Canvas { } public void fillGrid(TileGenerator tileGenerator){ - tileGrid.fill(tileGenerator); + grid.fill(tileGenerator); } - public void drawGridTile(Grid tileGrid){ + public void draw(Grid tileGrid){ + drawSquares(tileGrid); + strokeSquares(tileGrid); + } + + private void drawSquares(Grid tileGrid) { for(int row = 0; row < numberOfRows; row++) for(int column = 0; column < numberOfColumns; column++){ - Tile tile = tileGrid.getSquare(row, column).getTile(); - drawTile(tile, column * tileWidth, row * tileHeight); + Square square = tileGrid.getSquare(row, column); + drawSquare(square, column * tileWidth, row * tileHeight); } } - private void drawTile(Tile tile, double x, double y) { + private void strokeSquares(Grid tileGrid) { + for(int row = 0; row < numberOfRows; row++) + for(int column = 0; column < numberOfColumns; column++){ + Square square = tileGrid.getSquare(row, column); + strokeSquare(square, column * tileWidth, row * tileHeight); + } + } + + + private void strokeSquare(Square square, double x, double y) { + PointType[] cornerTypes = PointType.values(); + double[] xPoints = new double[cornerTypes.length]; + double[] yPoints = new double[cornerTypes.length]; + for(int index = 0; index < cornerTypes.length; index++){ + xPoints[index] = x + (cornerTypes[index].getXPosition() * tileWidth); + yPoints[index] = y + (cornerTypes[index].getYPosition() * tileHeight); + } + final int indexCenter = 4; + for(CardinalDirection side : CardinalDirection.values()) { + int indexCorner0 = side.ordinal(); + int indexCorner1 = (indexCorner0+1)%4; + strokeSquareSide(square, xPoints[indexCorner0], yPoints[indexCorner0], xPoints[indexCorner1], yPoints[indexCorner1], side); + strokeInternalTriangleSide(square, xPoints[indexCorner0],yPoints[indexCorner0],xPoints[indexCenter],yPoints[indexCenter], side); + } + } + + private void strokeSquareSide(Square square, double x0, double y0, double x1, double y1, CardinalDirection side) { + if(square.compatibleSides(List.of(square.getTile().side(side)), side).isEmpty()) + graphicsContext.strokeLine(x0, y0, x1, y1); + } + + private void strokeInternalTriangleSide(Square square, double x0, double y0, double x1, double y1, CardinalDirection side) { + Tile tile = square.getTile(); + if(!tile.side(side).accept(tile.side(Rotation.THREE_QUARTER_TURN.rotatedDirection(side)))) + graphicsContext.strokeLine(x0, y0, x1, y1); + } + + private void drawSquare(Square square, double x, double y) { for(CardinalDirection side: CardinalDirection.values()){ - drawSideTriangle(tile, x, y, side); + drawSideTriangle(square, x, y, side); } } - private void drawSideTriangle(Tile tile, double x, double y, CardinalDirection side){ + private void drawSideTriangle(Square square, double x, double y, CardinalDirection side){ + Color color = square.getTile().side(side).color(); List<PointType> cornerTypes = PointType.trianglePointTypes(side); - double[] xPoints = new double[3]; - double[] yPoints = new double[3]; - for(int index = 0; index < 3; index++){ + int size = PointType.trianglePointTypes(side).size(); + double[] xPoints = new double[size]; + double[] yPoints = new double[size]; + for(int index = 0; index < size; index++){ xPoints[index] = x + (cornerTypes.get(index).getXPosition() * tileWidth); yPoints[index] = y + (cornerTypes.get(index).getYPosition() * tileHeight); } - - Color color = tile.side(side).color(); graphicsContext.setFill(color); - graphicsContext.strokePolygon(xPoints, yPoints, 3); - graphicsContext.fillPolygon(xPoints, yPoints, 3); + graphicsContext.fillPolygon(xPoints, yPoints, size); } } diff --git a/src/main/java/view/PointType.java b/src/main/java/view/PointType.java index a5309438b5cb7902d6eb072159eb2607b4079cff..54061428e8e5b8f7ad0b110fce55ad335bbcb1c3 100644 --- a/src/main/java/view/PointType.java +++ b/src/main/java/view/PointType.java @@ -7,8 +7,8 @@ import java.util.List; public enum PointType { NORTH_WEST_CORNER(0,0), NORTH_EAST_CORNER(1,0), - SOUTH_WEST_CORNER(0,1), SOUTH_EAST_CORNER(1,1), + SOUTH_WEST_CORNER(0,1), CENTER(0.5,0.5); private final double xPosition; private final double yPosition; @@ -23,7 +23,7 @@ public enum PointType { case NORTH -> List.of(PointType.NORTH_WEST_CORNER, PointType.NORTH_EAST_CORNER, PointType.CENTER); case EAST -> List.of(PointType.NORTH_EAST_CORNER, PointType.SOUTH_EAST_CORNER, PointType.CENTER); case SOUTH -> List.of(PointType.SOUTH_EAST_CORNER, PointType.SOUTH_WEST_CORNER, PointType.CENTER); - case WEST -> List.of(PointType.NORTH_WEST_CORNER, PointType.SOUTH_WEST_CORNER, PointType.CENTER); + case WEST -> List.of(PointType.SOUTH_WEST_CORNER, PointType.NORTH_WEST_CORNER, PointType.CENTER); }; }