Как построить основанную на треугольнике сетку в 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 свойства:
- многоугольник
- Точка, где нарисован многоугольник
- Цвет многоугольника
Затем вы добавляете каждую ячейку в ArrayList. В коде рисования вы просто перебираете ArrayList для рисования каждой ячейки. Преимущество этого подхода заключается в том, что вы не выполняете все расчеты каждый раз, когда необходимо перекрасить панель.
Расстояние между рядами смещено.
Когда у вас есть Shape
Вы хотите рисовать, вы можете использовать getBounds()
Метод Формы. Затем:
- для горизонтального положения вы бы использовали ширину / 2
- для вертикального положения вы бы использовали высоту.
В этом сценарии мы можем предположить, что это либо JPanel, либо JFrame.
Это никогда не будет JFrame. Настраиваемое рисование выполняется путем переопределения paintComponent() для JPanel (или JComponent). Затем вы добавляете панель в рамку.
Я уверен, что есть гораздо более простые решения.
Не обязательно проще, но вы можете попробовать играть с фигурами для многоразового класса, который позволяет создавать интересные фигуры. Это также позволяет вращать данный Shape
,