2015-11-28 2 views
1

В настоящее время я работаю над игрой, для которой требуется рендеринг сетки шестиугольника, чтобы обеспечить место для игры. Я использую координаты смещения для хранения гексагональной сетки в памяти. Когда я пытаюсь отобразить сетку, я получаю результат, подобный следующему, с пробелом между гексами. Я хочу, чтобы гексы были идеально выровнены так, чтобы все необходимые точки находились в одних и тех же точках и чтобы их линии перекрывались, и между гексами не было места.Как визуализировать шестнадцатеричную сетку

Координаты внутри каждого шестнадцатеричного значения представляют координаты смещения шестигранный. hex grid with extra space between the hexes

Я использую расстояние, показанное на следующем рисунке (source), чтобы решить, где сделать каждый гекс. hex grid with background rectangular grid showing distance between the centers of pointy-topped hexes

Единственный вопрос в StackExchange, который я смог найти, касается проблемы, которая звучит так: here. Однако он говорит только о структуре данных для хранения гексов, а не о том, как их отобразить из указанной структуры. Я пытаюсь сделать их как описано here, однако, я получаю багги результат, показанный выше.

Вот часть моего кода, который обрабатывает рендеринг (это должно быть легко сделать вывод о том, что различные пользовательских методах делать, если есть какая-либо путаница, пожалуйста, дайте мне знать):

@Override 
public void paint(Graphics g){ 
    int quarterHexSize = 32; //using non static final member variables because I want to make this dynamically determine the largest size of the hexagons that will fit on the screen later 
    int halfHexSize = quarterHexSize * 2; 
    int hexSize = halfHexSize * 2; 
    int cx, cy, renderX, renderY; 

    g.setColor(Color.DARK_GRAY); 
    g.fillRect(0, 0, getWidth(), getHeight()); 

    g.setColor(Color.WHITE); 
    for(cx=0;cx<5;cx++){ 
     for(cy=0;cy<5;cy++){ 
      Hex hex = board.getHexAt(cx, cy); 

      if(hex != null){ 
       renderX = cx * 2; //multiplying by 2 rather than using floats to represent half offset to simplify code and because IIRC integers are faster, I got the same error when using floats 
       renderY = cy * 2; 

       if(renderY % 4 != 0){ 
        renderX++; 
       } 

       //converts the somewhat arbitrary units into the actual display size units using the values from the image in the question 
       renderX *= hexSize; 
       renderY *= quarterHexSize * 3f; 

       //the numbers are divided by 2 to make up for the offset 
       renderX /= 2; 
       renderY /= 2; 

       //64 is added to both dimensions to shift the grid inside the window 
       renderX += 64; 
       renderY += 64; 

       drawHex(new RenderPoint(renderX, renderY), halfHexSize, g); 
       g.drawString(cx + ", " + cy, renderX, renderY); 
      } 
     } 
    } 
} 

private void drawHex(RenderPoint center, int hexSize, Graphics g){ 
    drawHexLine(center, hexSize, 0, 1, g); 
    drawHexLine(center, hexSize, 1, 2, g); 
    drawHexLine(center, hexSize, 2, 3, g); 
    drawHexLine(center, hexSize, 3, 4, g); 
    drawHexLine(center, hexSize, 4, 5, g); 
    drawHexLine(center, hexSize, 5, 0, g); 
} 

private void drawHexLine(RenderPoint center, int hexSize, int firstCornerNum, int secondCornerNum, Graphics g){ 
    RenderPoint firstCornerNumHexPoint = getHexCorner(center, hexSize, firstCornerNum); 
    RenderPoint secondCornerNumHexPoint = getHexCorner(center, hexSize, secondCornerNum); 

    g.drawLine(
      firstCornerNumHexPoint.getX(), firstCornerNumHexPoint.getY(), 
      secondCornerNumHexPoint.getX(), secondCornerNumHexPoint.getY() 
    ); 

    //g.drawString(String.valueOf(firstCornerNum), firstCornerNumHexPoint.getX(), firstCornerNumHexPoint.getY()); 
} 

private RenderPoint getHexCorner(RenderPoint center, int hexSize, int cornerNum){ 
    return RenderPoint.doublesToInts(//simply rounds the provided doubles and creates a RenderPoint object with these new rounded values 
      center.getX() + hexSize * Math.sin(cornerNum * 60 * 0.0174533), //decimal number converts from degrees to radians 
      center.getY() + hexSize * Math.cos(cornerNum * 60 * 0.0174533) 
    ); 
} 

ответ

0

я определил, что ошибка была. Я пропустил конкретную деталь в webpage, когда я предположил, что диаграмма, опубликованная в вопросе, полностью объяснила размещение шестиугольников.

Я изменил переменную RenderX к:

renderX *= Math.round(HALF_SQRT_THREE * hexSize); 

HALF_SQRT_THREE является константой, я определен в переменной, чтобы избежать перерасчета его каждый раз шестиугольник визуализируется. Он определяется как Math.sqrt(3)/2.0.

Вот цитата из webpage:

Ширина шестиугольника ширина = SQRT (3)/2 * высота. Горизонтальное расстояние между соседними гексами равно горизонтам = ширина.

Смежные вопросы