Как построить сетку на основе треугольника в Java с помощью Swing?

Как построить сетку на основе треугольника в Java с помощью Swing.

Контекст:

Я искал это довольно долго; Я видел много вопросов во время моего поиска в Интернете.

Однако, как вы можете видеть; большинство из них сосредоточено только на одном Треугольнике. Я пытаюсь сделать сетку.

Проблема:

Ниже приведен скриншот моего текущего затруднительного положения. Я успешно сделал ряд треугольников, однако я явно сделал что-то не так. Расстояние между строками смещено.

Во-первых, я приношу свои извинения за то, насколько темное это изображение. Как видите, каждая строка содержит четыре треугольника. Вы можете почти увидеть «ряды» между желтым и зеленым треугольниками.

(Извините за ссылку, это мой первый вопрос, у меня нет возможности публиковать встроенные изображения)

Фрагмент кода

Прошу прощения за продвинутость, этот код выглядит плохо написанным.

Это код, который я придумал для создания треугольной сетки.

for (int x = 0; x < board.width; x++) {
  for (int y = 0; y < board.height; y++) {
    int numberOfSides = 3;
    double sideLength = cellSize;
    if(y%2==0) {
      if(x%2==0) {
        Polygon triA = new Polygon();
        for (int i = 0; i < numberOfSides; i++) {
          triA.addPoint(
            (int) ((cellSize) + (cellSize * x)
            + sideLength * Math.sin(i * 2 * Math.PI / numberOfSides)),
            (int) ((cellSize) + (cellSize * y)
            + sideLength * Math.cos(i * 2 * Math.PI / numberOfSides))
          );
         }
         g.setColor(Color.GREEN);
         g.drawPolygon(triA);
       } else {
         Polygon triA = new Polygon();
         for (int i = 0; i < numberOfSides; i++) {
           triA.addPoint(
             (int) ((cellSize) + (cellSize * x)
             - sideLength * Math.sin(i * 2 * Math.PI / numberOfSides)),
             (int) ((cellSize+sideLength/2) + (cellSize * y)
             - sideLength * Math.cos(i * 2 * Math.PI / numberOfSides))
           );
         }
         g.setColor(Color.RED);
         g.drawPolygon(triA);
       } else {
         if(x%2==0) {
           Polygon triA = new Polygon();
             for (int i = 0; i < numberOfSides; i++) {
               triA.addPoint(
                 (int) ((cellSize) + (cellSize * x)
                 - sideLength * Math.sin(i * 2 * Math.PI / numberOfSides)),
                 (int) ((cellSize+cellSize) + (cellSize * y)
                 - sideLength * Math.cos(i * 2 * Math.PI / numberOfSides))
               );
             }
             g.setColor(Color.YELLOW);
             g.drawPolygon(triA);
           } else {
             Polygon triA = new Polygon();
             for (int i = 0; i < numberOfSides; i++) {
               triA.addPoint(
                 (int) ((cellSize) + (cellSize * x)
                 + sideLength * Math.sin(i * 2 * Math.PI / numberOfSides)),
                 (int) ((cellSize+cellSize/2) + (cellSize * y)
                 + sideLength * Math.cos(i * 2 * Math.PI / numberOfSides))
               );
             }
             g.setColor(Color.BLUE);
             g.drawPolygon(triA);
           }
         }

Очевидные проблемы

Итак, основной проблемой на данный момент является размер и расстояние между треугольниками. Мой код явно не самый лучший в мире, и я уверен, что есть гораздо более простые решения. Это изображение ниже - это то, что я пытаюсь воспроизвести:

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

Цель этой цели?

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

Для тех, кто заинтересован, вот ссылка на блог ученого-компьютерщика, посвященного треугольным клеточным автоматам. Я хочу повторить их результаты однажды. Треугольная игра жизни Жизнь

Конец примечания

Я был бы очень признателен за некоторые советы о том, как построить сетку треугольников. Я уверен, что есть гораздо более точные методы, такие как использование DrawLine. Также буду признателен за отзыв по моему вопросу. Это мой первый вопрос о Stackoverflow после довольно долгого использования сайта. Я постараюсь следить за этим постом в течение дня, если у кого-то возникнут ко мне вопросы.


person Mannjamin    schedule 27.03.2018    source источник


Ответы (1)


Polygon можно повторно использовать в рисовании, поэтому вам нужно всего лишь создать 2 многоугольника, один с треугольником, направленным вверх, а другой — треугольником, направленным вниз.

Затем, когда вы рисуете, вы используете метод Graphic.translate(...) для позиционирования многоугольника. Или другой вариант — создать собственный класс, содержащий 3 свойства:

  1. Полигон
  2. Точка, где многоугольник окрашен
  3. Цвет полигона

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

Расстояние между строками смещено.

Когда у вас есть Shape, который вы хотите нарисовать, вы можете использовать метод getBounds() формы. Потом:

  1. для горизонтального положения вы должны использовать ширину / 2
  2. для вертикального положения вы должны использовать высоту.

В этом сценарии мы можем предположить, что это либо JPanel, либо JFrame.

Это никогда не будет JFrame. Пользовательское рисование выполняется путем переопределения paintComponent() панели JPanel (или JComponent). Затем вы добавляете панель в рамку.

Я уверен, что есть гораздо более простые решения.

Не обязательно проще, но вы можете ознакомиться с Игра с фигурами для повторно используемого класса, который позволяет создавать интересные формы. Это также позволяет вам вращать данный Shape.

person camickr    schedule 27.03.2018