当前位置: 首页 > 知识库问答 >
问题:

用JavaFX创建六角形字段

裴泰平
2023-03-14

我的目标是创建一个六边形瓷砖的领域。我已经有了一个单元格矩阵,每个单元格的高度足以适合完整的六边形图像:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class UITest extends Application {
    final private static String TILE_IMAGE_LOCATION = System.getProperty("user.dir") + File.separatorChar +"resources"+ File.separatorChar + "blueTile.png";
    final private static Image HEXAGON_IMAGE = initTileImage();

    private static Image initTileImage() {
        try {
            return new Image(new FileInputStream(new File(TILE_IMAGE_LOCATION)));
        } catch (FileNotFoundException e) {
            throw new IllegalStateException(e);
        }
    }
    public void start(Stage primaryStage) {
        int height = 4;
        int width = 6;
        GridPane tileMap = new GridPane();
        Scene content = new Scene(tileMap, 800, 600);
        primaryStage.setScene(content);

        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                ImageView tile = new ImageView(HEXAGON_IMAGE);
                GridPane.setConstraints(tile, x, y);
                tileMap.getChildren().add(tile);
            }
        }

        primaryStage.show();
    }
}

我的问题不是垂直间隙,我可以通过将网格窗格的vgap()添加到一个适当的值来确定垂直间隙。对我来说,困难是将每第二行向右移动半个单元宽度。

我怎样才能最好地实现每隔一排的移位?

共有1个答案

伊锦
2023-03-14

我花了一些时间才弄明白。希望能有所帮助。我不使用图像。它是由多边形组成的,你可以自定义笔画和填充颜色,以及宽度。

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.scene.layout.AnchorPane;
import javafx.scene.paint.Paint;
import javafx.scene.shape.Polygon;

public class UITest extends Application {
    public void start(Stage primaryStage) {
        int height = 600;
        int width = 800;
        AnchorPane tileMap = new AnchorPane();
        Scene content = new Scene(tileMap, width, height);
        primaryStage.setScene(content);
        double size = 50,v=Math.sqrt(3)/2.0;
        for(double y=0;y<height;y+=size*Math.sqrt(3))
        {
            for(double x=-25,dy=y;x<width;x+=(3.0/2.0)*size)
            {
                Polygon tile = new Polygon();
                tile.getPoints().addAll(new Double[]{
                    x,dy,
                    x+size,dy,
                    x+size*(3.0/2.0),dy+size*v,
                    x+size,dy+size*Math.sqrt(3),
                    x,dy+size*Math.sqrt(3),
                    x-(size/2.0),dy+size*v
                });
                tile.setFill(Paint.valueOf("#ffffff"));
                tile.setStrokeWidth(2);
                tile.setStroke(Paint.valueOf("#000000") );
                tileMap.getChildren().add(tile);
                dy = dy==y ? dy+size*v : y;
            }
        }
        primaryStage.show();
    }
    public static void main(String[] args)
    {
        launch(args);
    }
}
 类似资料:
  • 我想生成多个六边形存在的扁平岛屿。到目前为止,我已经能够用代码创建六边形网格,但不知道如何将它们分组,创建一个随机形状的岛。(任何形状,不是一个完美的圆,正方形等)我想我需要一个算法,将六边形瓷砖旁边的现有瓷砖的多个边。如果你能帮我一个算法的想法,那就太好了。

  • 现在,我们的WebGL包装器已经构建好,让我们在屏幕上绘制一个简单的三角形,来创建我们的第一个WebGL应用。它将作为创建更复杂的3D模型的典型步骤的良好基础。本节,我们将介绍位置缓冲区的概念,它其实就是用来定义3D模型的位置和形状的顶点的数组。 图9-1 创建三角形平面 操作步骤 按照以下步骤使用WebGL渲染一个2D三角形: 1. 链接到glMatrix库和WebGL包装器: <script

  • 我试图在Angular中创建一个虚拟模型,以从后端获取值。但由于数组的原因,它会抛出一些错误。 浏览器控制台错误 ERROR TypeError:无法读取MapSubscriber.Project(CARB.Service.ts:33)上Array.Map( )上的新Bolus(abc.ts:39)上未定义的属性“|0”。/node_modules/rxjs/_esm5/internal/oper

  • 我刚开始使用JavaFX,有一个问题。在我的项目中,我想使用旋转矩形。但矩形只围绕其中心旋转,我希望它围绕其左上角旋转。 就像这张照片(从这里开始): 下面是我的项目中的一些代码: 在这种情况下,如果按下箭头键,矩形会旋转。

  • 问题内容: 我试图创建像蜜蜂梳子那样相互连接的10.000个六边形,我想将所有这些都创建为一个元素,然后将一些东西导入其中,但是为了将六边形连接在一起,我的算法在连接了前6个元素后就卡住了。这是我在Java中的算法。我用Java进行测试。另外,我想使它们的尺寸比连接前更小。 这是我的五角形课 } 问题答案: 创建矩形网格非常明显-只需倾斜矩形网格(要么全部倾斜并获得平行四边形,然后使用模将其包装,