【发布时间】:2018-03-27 07:31:36
【问题描述】:
如何使用 Swing 在 Java 中构建基于三角形的网格。
上下文:
我已经搜索了很长时间; 在我搜索互联网的过程中,我看到了很多问题。
但是,如您所见;他们中的大多数只关注一个三角形。我正在尝试制作一个网格。
问题:
下面是我目前困境的截图。我已经成功地制作了一排三角形,但是我显然做错了。行之间的间距是偏移的。
(我为链接道歉,这是我的第一个问题,我没有能力发布嵌入的图像)
代码片段
我很抱歉,这段代码看起来写得不好。
这是我迄今为止提出的用于制作三角形网格的代码。
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);
}
}
明显的问题
所以,到目前为止,主要问题是三角形的大小和间距。我的代码显然不是世界上最好的,我确信有一些更简单的解决方案。下面这张图片是我想要复制的:
Here is my end Goal. 我不希望像这张图片那样制作一个小网格,但是对行使用相同的规则,我想制作一个填充整个板的三角形网格。在这种情况下,我们可以假设这是一个 JPanel 或 JFrame。
这个目标的目的?
我想再次为这个问题的含糊之处道歉。 我正在尝试为我正在对元胞自动机进行的一些研究构建一个三角形网格。我提供的代码 sn-p 曾经是根据我构建的六边形网格生成方法制作的。我将 numberOfSides 变量更改为三个并调整 sideLength 变量以尝试删除间距。这就是我的问题发生的地方。
对于那些感兴趣的人,这里是一个计算机科学家关于三角元胞自动机的博客的链接。我希望有一天能复制他们的结果。 Triangular Game of Life
尾注
对于如何构建三角形网格的一些指导,我将不胜感激。我确信有一些更准确的方法,例如使用 DrawLine。我也希望能对我的问题提供一些反馈。这是我在使用该网站很长一段时间后关于 Stackoverflow 的第一个问题。 如果有人对我有任何问题,我会尽我所能全天监控这篇文章。
【问题讨论】:
-
正如所写,这个问题对于 Stack Overflow 来说太宽泛了。我会将其缩小到解决特定问题,而不是“帮我建立一个网格”,针对该特定问题,创建一个minimal reproducible example。
-
我明白,我必须承认这是一个非常模糊的问题。谢谢你的链接,我找不到很多有用的链接来问一个有效的问题。我想,为了缩小我的问题,我的主要问题是了解如何构建这样的网格。 Square Grids 非常简单,你有一个 X 和 Y 轴,你在每个块上放置一个 Square。但是,由于三角形的性质,您必须考虑偏移量才能制作均匀对称的三角形网格,这是我迄今为止无法理解的。
标签: java swing cellular-automata