I used the hexagon code in this tutorial and created the createHex class (should I post the code?). The linked webpage used the following code to actually draw hexagons using math in createHex:
@Override public void paint(Graphics g){ for(int j = 0; int j < BOARD_HEIGHT; j++){ for(int i = 0; i < BOARD_HEIGHT; I++){ mCellMetrics.setCellIndex(i, j); if(mCells[j][i] != 0){ mCellMetrics.computeCorners(mCornersX, mCornersY); g.setColor((mCells[j][i] == L_ON) ? COLOR.ORANGE):COLOR.GRAY; g.fillPolygon(mCornersX, mCornersY, NUM_HEX_CORNERS); g.setColor(COLOR.BLACK) g.drawPolygon(mCornersX, mCornersY, NUM_HEX_CORNERS); } } } }
The problem I am facing is that Android does not have a Graphics class that contains all the necessary methods. I spent about an hour and a half fishing around the android documentation, and the closest I found was the Path class, but it is not the methods I need. I want to use the hexagon code in the related article at the top, but I cannot find the equivalent of the graphics class. If there is no equivalent, can someone show me how to get the results that I want to use related code?
My question is: how can I port the code in a related article to android?
EDIT:
I decided that this could be useful to others (and potential respondents) if I included a hexagon code that calculates sides and something else like a hexagon, so here is createHex.java:
package com.rush; /** * Uniform hexagonal grid cell metrics utility class. */ public class HexGridCell { private static final int[] NEIGHBORS_DI = { 0, 1, 1, 0, -1, -1 }; private static final int[][] NEIGHBORS_DJ = { { -1, -1, 0, 1, 0, -1 }, { -1, 0, 1, 1, 1, 0 } }; private final int[] CORNERS_DX; // array of horizontal offsets of the cell corners private final int[] CORNERS_DY; // array of vertical offsets of the cell corners private final int SIDE; private int mX = 0; // cell left coordinate private int mY = 0; // cell top coordinate private int mI = 0; // cell horizontal grid coordinate private int mJ = 0; // cell vertical grid coordinate /** * Cell radius (distance from center to one of the corners) */ public final int RADIUS; /** * Cell height */ public final int HEIGHT; /** * Cell width */ public final int WIDTH; public static final int NUM_NEIGHBORS = 6; /** * @param radius Cell radius (distance from the center to one of the corners) */ public HexGridCell(int radius) { RADIUS = radius; WIDTH = radius * 2; HEIGHT = (int) (((float) radius) * Math.sqrt(3)); SIDE = radius * 3 / 2; int cdx[] = { RADIUS / 2, SIDE, WIDTH, SIDE, RADIUS / 2, 0 }; CORNERS_DX = cdx; int cdy[] = { 0, 0, HEIGHT / 2, HEIGHT, HEIGHT, HEIGHT / 2 }; CORNERS_DY = cdy; } /** * @return X coordinate of the cell top left corner. */ public int getLeft() { return mX; } /** * @return Y coordinate of the cell top left corner. */ public int getTop() { return mY; } /** * @return X coordinate of the cell center */ public int getCenterX() { return mX + RADIUS; } /** * @return Y coordinate of the cell center */ public int getCenterY() { return mY + HEIGHT / 2; } /** * @return Horizontal grid coordinate for the cell. */ public int getIndexI() { return mI; } /** * @return Vertical grid coordinate for the cell. */ public int getIndexJ() { return mJ; } /** * @return Horizontal grid coordinate for the given neighbor. */ public int getNeighborI(int neighborIdx) { return mI + NEIGHBORS_DI[neighborIdx]; } /** * @return Vertical grid coordinate for the given neighbor. */ public int getNeighborJ(int neighborIdx) { return mJ + NEIGHBORS_DJ[mI % 2][neighborIdx]; } /** * Computes X and Y coordinates for all of the cell 6 corners, clockwise, * starting from the top left. * * @param cornersX Array to fill in with X coordinates of the cell corners * @param cornersX Array to fill in with Y coordinates of the cell corners */ public void computeCorners(int[] cornersX, int[] cornersY) { for (int k = 0; k < NUM_NEIGHBORS; k++) { cornersX[k] = mX + CORNERS_DX[k]; cornersY[k] = mY + CORNERS_DY[k]; } } /** * Sets the cell horizontal and vertical grid coordinates. */ public void setCellIndex(int i, int j) { mI = i; mJ = j; mX = i * SIDE; mY = HEIGHT * (2 * j + (i % 2)) / 2; } /** * Sets the cell as corresponding to some point inside it (can be used for * eg mouse picking). */ public void setCellByPoint(int x, int y) { int ci = (int)Math.floor((float)x/(float)SIDE); int cx = x - SIDE*ci; int ty = y - (ci % 2) * HEIGHT / 2; int cj = (int)Math.floor((float)ty/(float)HEIGHT); int cy = ty - HEIGHT*cj; if (cx > Math.abs(RADIUS / 2 - RADIUS * cy / HEIGHT)) { setCellIndex(ci, cj); } else { setCellIndex(ci - 1, cj + (ci % 2) - ((cy < HEIGHT / 2) ? 1 : 0)); } } }
For an explanation of how the code works, see the related article.