【问题标题】:How to build a Triangle-based Grid in Java using Swing?如何使用 Swing 在 Java 中构建基于三角形的网格?
【发布时间】:2018-03-27 07:31:36
【问题描述】:

如何使用 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.

(我为链接道歉,这是我的第一个问题,我没有能力发布嵌入的图像)

代码片段

我很抱歉,这段代码看起来写得不好。

这是我迄今为止提出的用于制作三角形网格的代码。

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


【解决方案1】:

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

然后,当您进行绘画时,您可以使用 Graphic.translate(...) 方法来定位多边形。或者另一种选择是创建一个包含 3 个属性的自定义类:

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

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

行之间的间距是偏移的。

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

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

在这种情况下,我们可以假设这是 JPanel 或 JFrame。

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

我确信有一些更简单的解决方案。

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

【讨论】:

    猜你喜欢
    • 2019-09-18
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多