如何使用 Swing 在 Java 中构建基于三角形的网格?

How to build a Triangle-based Grid in Java using Swing?

如何使用 Swing 在 Java 中构建基于三角形的网格。

上下文:

我已经搜索了很长时间了; 我在网上搜索时看到了很多问题。

但是,如您所见;他们中的大多数只关注一个三角形。我正在尝试制作一个网格。

问题:

下面是我目前困境的截图。我已经成功地制作了一排三角形,但是我显然做错了什么。行之间的间距是偏移的。

First off, I Apologies for how dark this image is. As you can see, each row contains four Triangles. You can just about see the "Rows"between the Yellow and Green Triangles.

(很抱歉link,这是我的第一个问题,我没有能力post嵌入图像)

代码片段

在此先向您道歉,此代码看起来写得不好。

这是我到目前为止想出的用于制作三角形网格的代码。

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。

这个目标的目的?

再一次,对于这个问题的含糊不清,我深表歉意。 我正在尝试为我正在对元胞自动机进行的一些研究构建一个三角形网格。我提供的代码片段曾经是根据我构建的六边形网格生成方法制作的。我将 numberOfSides 变量更改为 3,并调整了 sideLength 变量以尝试删除间距。这是我的问题发生的地方。

对于那些感兴趣的人,这里是 link 计算机科学家关于三角元胞自动机的博客。我希望有一天能复制他们的结果。 Triangular Game of Life

尾注

如果能提供有关如何构建三角形网格的指导,我将不胜感激。我确信有一些更准确的方法,例如使用 DrawLine。我也很感激对我的问题的一些反馈。这是我在使用该网站一段时间后在 Whosebug 上提出的第一个问题。 如果有人有任何问题要问我,我会尽最大努力全天关注这个post。

一个Polygon可以在绘画中重复使用,所以你只需要创建2个多边形,一个三角形朝上,另一个三角形朝下。

然后在绘画时使用 Graphic.translate(...) 方法定位多边形。或者另一种选择是创建一个包含 3 个属性的自定义 class:

  1. 多边形
  2. 绘制多边形的点
  3. 多边形的颜色

然后将每个单元格添加到 ArrayList。在绘制代码中,您只需遍历 ArrayList 即可绘制每个单元格。这种方法的优点是您不必在每次需要重新绘制面板时都进行所有计算。

The spacing between row's are offset.

一旦有了要绘制的Shape,就可以使用Shape的getBounds()方法了。那么:

  1. 对于水平位置,您将使用宽度 / 2
  2. 对于垂直位置,您将使用高度。

In this scenario, we can assume this is either a JPanel or JFrame.

它永远不会是 JFrame。自定义绘画是通过覆盖 JPanel(或 JComponent)的 paintComponent() 来完成的。然后将面板添加到框架中。

I'm sure there are some much simpler solutions.

不一定更简单,但您可能想查看 Playing With Shapes 以获取可重复使用的 class,它允许您创建一些有趣的形状。它还允许您旋转给定的 Shape.