Как создать случайный многоугольник с центром в Java? - PullRequest
0 голосов
/ 20 марта 2020

Я хочу создать произвольный многоугольник, но я хочу, чтобы он был более или менее центрирован в середине заданных координат окна.

Вот мой код, он генерирует случайный многоугольник, но большую часть времени он находится в нижней части окна, и я бы хотел, чтобы он был немного более центрирован:

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

1 Ответ

0 голосов
/ 20 марта 2020

Вы рассчитали центр, но нигде его не используете. Просто чтобы я правильно понял, это только 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
    };


}
...