est-il possible de quadriller une forme polyligne JavaFX


Je fais donc actuellement un jeu en JavaFX et le plateau a la forme d'un hexagone. J'ai utilisé la polyligne et lui ai donné des points fixes comme indiqué ci-dessous.

    // Create a hexagon
    Polyline hexagon = new Polyline(400.0,600.0,
                                    700.0,600.0,
                                    800.0,400.0, 
                                    700.0,200.0,
                                    400.0,200.0,
                                    300.0,400.0,
                                    400.0,600.0
                                    );
        hexagon.setFill(Color.BLACK);
        hexagon.setStroke(Color.BLACK);

J'obtiens cette sortie

sortie

Le problème que j'ai est d'essayer de quadriller cette forme. quelqu'un pourrait-il me montrer comment grider une importation de polyligne? ou serais-je mieux de créer un hexagone à partir d'une boucle for avec la grille construite dans? si oui pourriez vous me dire la meilleure façon possible de faire une forme hexagonale à partir d'un pour la boucle? grâce.

Author: fabian, 2016-12-08

1 answers

Toutes les valeurs ne seront jamais intégrales, car la hauteur du polygone est

(width * sqrt(3)) / 2

Votre forme peut ressembler à un hexagone régulier, mais ce n'en est pas un, ce qui devient évident une fois que vous créez une grille à partir de ces formes.

La façon la plus simple de créer cela serait d'utiliser des coordonnées polaires avec une origine au centre du polygone et de les convertir en coordonnées cartésiennes. De plus, je recommande d'utiliser Polygon au lieu de Polyline, car cette forme est automatiquement fermé.

Pour calculer les positions de la grille, notez que vous pouvez simplement placer les hexagones l'un en dessous de l'autre avec un décalage égal à la hauteur de l'hexagone (radius * sqrt(3)) dans la direction verticale. Dans le sens horizontal, la différence en coordonnées x est (3/2) * radius, puisque le point le plus à gauche de l'hexagone suivant est aligné avec le point en bas à droite ou en haut à droite de l'hexagone précédent. La coordonnée y est modifiée de la moitié de la hauteur de l'hexagone (alternant de haut en bas).

private final static double HEX_RAD_DELTA = Math.PI / 3;

public static Polygon createHexagon(double centerX, double centerY, double radius, Paint fill) {
    Polygon hex = new Polygon();

    // comparing to 6 is enough to ensure every angle is used once here
    // since (5/6) * 2 * PI < 6 < 2 * PI
    for (double rad = 0; rad < 6; rad += HEX_RAD_DELTA) {
        hex.getPoints().addAll(Math.cos(rad) * radius + centerX, Math.sin(rad) * radius + centerY);
    }

    hex.setFill(fill);
    hex.setStroke(Color.BLACK);
    return hex;
}

@Override
public void start(Stage primaryStage) {
    Color[] fills = new Color[] {
        Color.RED,
        Color.BLUE,
        Color.LIME,
        Color.ORANGE,
        Color.TURQUOISE,
        Color.BROWN,
        Color.YELLOW
    };

    final double radius = 50;
    final double dY = radius * Math.sqrt(3) / 2;

    Pane root = new Pane();
    for (int y = 0, colorIndex = 0; y < 10; y++) {
        double offsetY  = 2 * dY * y + 50;
        for (int x = 0; x < 10; x++, colorIndex = (colorIndex + 1) % fills.length) {
            root.getChildren().add(createHexagon(
                    1.5 * radius * x + 50,
                    (x & 1) == 0 ? offsetY : offsetY + dY,
                    radius,
                    fills[colorIndex]));
        }
    }

    Scene scene = new Scene(root);

    primaryStage.setScene(scene);
    primaryStage.show();
}
 2
Author: fabian, 2016-12-08 10:35:07