En utilisant svg.js, j'ai dessiné un plateau (de jeu), qui est essentiellement un groupe de chemins en forme d'hexagone. Une fois tous les hexagones ajoutés, je voudrais faire pivoter l'ensemble du groupe de -60 degrés, puis lire une boîte rectangulaire minimale qui englobe la forme (visuelle) résultante.
Apparence de la planche et de la boîte (dessinée à la main en rouge) que je souhaite :
Mais je n'arrive pas à trouver comment obtenir la boîte rouge ; tout ce que j'obtiens semble être des boîtes autour de la forme bleue (qui est bien sûr la bbox de tout le groupe, elle-même tournée) :
Les conseils que j'ai trouvés étaient d'utiliser un groupe extérieur (contenant à son tour le groupe qui collecte les champs) ; de faire tourner le groupe intérieur, et d'obtenir bbox() du groupe extérieur ; malheureusement, cela n'a rien changé. Alternativement, certaines sources sur le web suggéraient d'utiliser rbox() à la place, mais là encore, cela ne changeait rien, et ce n'est même pas dans la documentation de svg.js 3.0.
Pour être complet, le code qui fait les choses connexes, même si cette question semble être un problème plus général. Je me rends compte que je pourrais contourner le problème en évitant la rotation en premier lieu, mais j'aimerais trouver une solution qui permette de traiter une série de cas similaires sans modification manuelle.
draw_board() {
let grp = this.canvas.group();
for (let field of this.fields) {
field.hex_display = grp.use(hexsym).size(this.w*this.hex_scale,this.h*this.hex_scale)
.center(field.cx,field.cy)
.addClass("hex_field")
.addClass(this.color);
}
let count = this.field.length;
let clipper = this.canvas.clip().path()
.M(...this.center(0,0))
.L(...this.center(0,count-1))
.L(...this.center(count-1,count-1))
.L(...this.center(count-1,0))
.Z();
grp.clipWith(clipper);
grp.rotate(-60);
let bb = grp.bbox();
this.canvas.viewbox(bb.x,bb.y,bb.w,bb.h)
}
Avez-vous des conseils sur la manière d'aborder cette question ?