如何生成以 Java 为中心的随机多边形?

How to generate a random polygon centered in Java?

我想生成一些随机多边形,但我希望它或多或少位于给定 window 坐标的中心。

这是我的代码,它生成一个随机多边形,但大多数时候它位于 window 的底部,我想让它更居中:

    private static final double CORNER_MARGIN = 100.0; // max offset for a corner of the field, to randomize the polygon
    private static double[] standardPolygon(double x1, double x2, double y1, double y2) {
                                        // minX      maxX         minY      maxY --> it's the coordinate of the window
        double centerX = (x1 + x2) / 2;
        double centerY = (y1 + y2) / 2;

        // this is a standard polygon "centered" in the middle of the program window
        return new double[]{
                x1 -  (x2 - x1) * RANDOM.nextDouble(),  y2 + (y2 - y1) *RANDOM.nextDouble() * CORNER_MARGIN,
                x2 +  (x2 - x1) * RANDOM.nextDouble(),  y2 + (y2 - y1) *RANDOM.nextDouble() * CORNER_MARGIN,
                x2 +  (x2 - x1) * RANDOM.nextDouble(),  y1 - (y2 - y1) *RANDOM.nextDouble() * CORNER_MARGIN,
                x1 -  (x2 - x1) * RANDOM.nextDouble(),  y1 - (y2 - y1) *RANDOM.nextDouble() * CORNER_MARGIN,
        };

        /*return new double[]{
                x1 - RANDOM.nextDouble() * CORNER_MARGIN, y2 + RANDOM.nextDouble() * CORNER_MARGIN, // up left
                x2 + RANDOM.nextDouble() * CORNER_MARGIN, y2 + RANDOM.nextDouble() * CORNER_MARGIN, // up right
                x2 + RANDOM.nextDouble() * CORNER_MARGIN, y1 - RANDOM.nextDouble() * CORNER_MARGIN, // down right
                x1 - RANDOM.nextDouble() * CORNER_MARGIN, y1 - RANDOM.nextDouble() * CORNER_MARGIN, // down left
        };*/
    }

评论中的代码有效,但现在我试图将其居中,但我只得到一些 rectangles/squares。我怎样才能设法保持随机的多边形形式但更居中一点?

[编辑] 这是我绘制多边形面积的方法:

    private void drawZone(Group group, IGameParameters gameParameters) {
        Polygon polygon = new Polygon();
        double[] points = gameParameters.dronePadDeliveryZonePolygon();

        List<Double> pointsList = new ArrayList<>();
        for (double point : points) pointsList.add(point);

        polygon.getPoints().addAll(pointsList);
        polygon.setFill(Color.ANTIQUEWHITE);
        group.getChildren().add(polygon);
    }```

您计算了中心但没有在任何地方使用它。只是为了让我理解正确,这只是一个 4 边形多边形,角随机位于距 window?

角最多 100 的位置

我不是 100% 确定您希望多边形的形状如何,但请尝试一下。从逻辑上讲它在我的脑海中起作用,但我现在没有办法测试代码。

private static final double CORNER_MARGIN = 100.0; 
private static double[] standardPolygon(double x1, double x2, double y1, double y2) {

    double centerX = (x1 + x2) / 2;
    double centerY = (y1 + y2) / 2;


    // Get the corner offsets
    ox1 = x1 + CORNER_MARGIN * RANDOM.nextDouble(); // top left
    oy1 = y1 + CORNER_MARGIN * RANDOM.nextDouble();

    ox2 = x2 - CORNER_MARGIN * RANDOM.nextDouble(); // top right
    oy2 = y1 + CORNER_MARGIN * RANDOM.nextDouble();

    ox3 = x1 + CORNER_MARGIN * RANDOM.nextDouble(); // bottom left
    oy3 = y2 - CORNER_MARGIN * RANDOM.nextDouble();

    ox4 = x2 - CORNER_MARGIN * RANDOM.nextDouble(); // bottom right
    oy4 = y2 - CORNER_MARGIN * RANDOM.nextDouble();


    // Calculate the center of the polygon
    double cx = (ox2 - ox1) / 2;
    double cy = (oy2 - oy1) / 2;

    // difference between window's center and polygon
    double offsetX = centerX - cx;
    double offsetY = centerY - cy;

    // offset the calculated points so the polygon's center matches the window
    ox1 += offsetX;
    oy1 += offsetY;
    ox2 += offsetX;
    oy2 += offsetY;
    ox3 += offsetX;
    oy3 += offsetY;
    ox4 += offsetX;
    oy4 += offsetY;

    // this is a standard polygon "centered" in the middle of the program window
    return new double[]{
            ox1, oy1,
            ox2, oy2,
            ox3, oy3,
            ox4, oy4
    };


}