【问题标题】:How to generate a random polygon centered in Java?如何生成以Java为中心的随机多边形?
【发布时间】:2020-03-20 12:46:47
【问题描述】:

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

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

    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
        };*/
    }

注释中的代码正在运行,但现在我尝试将其居中,但我只得到一些矩形/正方形。我怎样才能设法保持随机多边形形式但更居中?

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

    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);
    }```

【问题讨论】:

  • 如果不看你是如何绘制多边形的,很难说清楚。但我会在函数中指定多边形的原点,并将所有顶点坐标作为相对于该原点的基础。在您的情况下,您将计算窗口的中心并定义原点。您正在随机化点到中心的距离,这将使它看起来没有在窗口中居中。您需要将坐标偏移多边形的整体尺寸。
  • 查看编辑以了解我如何绘制它
  • @Phaelaxz 我计算了 X 和 Y 的中心,我不太确定“随机化点到中心的距离”我该怎么做?

标签: java polygon


【解决方案1】:

您计算了中心,但没有在任何地方使用它。只是我理解正确,这只是一个 4 边多边形,并且角随机定位在距窗口角最多 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
    };


}

【讨论】:

  • 是的,现在我明白了我会继续努力的想法,因为它并没有完全按照我的意愿做,但我应该能够对更改做一些事情,谢谢
猜你喜欢
  • 2011-10-09
  • 1970-01-01
  • 1970-01-01
  • 2017-11-20
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 2021-02-13
  • 2023-04-01
相关资源
最近更新 更多