Как построить основанную на треугольнике сетку в 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. Буду также признателен за отзыв о моем вопросе. Это мой первый вопрос по Stackru, после того как я довольно долго пользовался сайтом. Я постараюсь следить за этим постом в течение дня, если у кого-то возникнут какие-либо вопросы.

1 ответ

Решение

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

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

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

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

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

Когда у вас есть Shape Вы хотите рисовать, вы можете использовать getBounds() Метод Формы. Затем:

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

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

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

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

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

Другие вопросы по тегам