Comment obtenir les coordonnées absolues de l'objet à l'intérieur d'un & gt; g & gt; groupe?
Cela peut être une FAQ, donc n'hésitez pas à me pointer à une autre réponse. Le sujet est difficile de faire des recherches sur les.
Si je veux utiliser d3.js pour obtenir un attribut qui est explicitement déclaré dans une SVG de l'objet, ou que j'ai explicitement mis là à l'aide de D3, je peux facilement obtenir la valeur de l'attribut à l'aide de d3.select
. Par exemple, cela s'imprime 300:
...
<circle id="mycircle" r="10" cx="100" cy="200">
...
d3.select("#mycircle").attr("cx", 300);
console.log(d3.select("#mycircle").attr("cx"));
Que faire si je n'ai pas explicite définir la valeur de l'attribut, mais il est implicitement "set" d'un <g>
groupe? Ou: Comment puis-je utiliser le code pour savoir où se trouve une <g>
groupe est centré? Je voudrais un moyen de déterminer où dans le système de coordonnées absolues de la <svg>
objet les choses à l'intérieur de la <g>
sont. Si je savais où la <g>
était, comment il est orienté dans l'espace, etc., Je pouvais comprendre où les points à l'intérieur d'elle. Comment puis-je le faire?
BigBadaboom remarques dans un commentaire sur une réponse à cette question que ce qui est hérité n'est pas une paire de coordonnées, mais un transform
attribut. Donc, je peux sélectionner un <g>
et obtenir la valeur de l'attribut transform:
console.log(d3.select("#mygroup").attr("transform"));
qui imprime, par exemple:
"rotate(-125.93)traduire(0,-25)"
Dois-je analyser que de savoir d'où l' <g>
est situé dans le système de coordonnées absolues?
source d'informationauteur Mars | 2014-09-25
Vous devez vous connecter pour publier un commentaire.
D'autres ici ont déjà mentionné
SVGLocatable.getBBox()
ce qui est utile pour saisir la boîte englobante d'un élément en fonction de son propre système de coordonnées local. Malheureusement, comme vous l'avez remarqué, cela ne prend pas en compte les transformations effectuées sur l'élément ou sur ses éléments parents.Il ya un couple d'autres fonctions disponibles qui vous aideront à sortir une tonne lorsque vous traitez avec ces transformations.
SVGLocatable.getScreenCTM()
vous donne unSVGMatrix
représentant les transformations nécessaires pour convertir à partir de la fenêtre d'affichage des coordonnées de coordonnées locales de votre élément. C'est formidable, parce qu'on va prendre en compte les transformations appliquées à l'élément auquel il est appelé, et toutes les transformations appliquées aux éléments parents. Malheureusement, il prend également en compte exactement où l'élément sur l'écran, ce qui signifie que si vous avez du contenu avant de votre document svg, ou même juste quelques marges autour d'elle, le retour de la matrice comprendra que l'espace d'une traduction.Element.getBoundingClientRect()
vous permettra de prendre en compte cet espace. Si vous appelez cette fonction sur le document SVG lui-même, vous pouvez trouver de combien, le SVG est décalé sur l'écran.Alors tout ce que vous avez à faire est de combiner les deux si vous voulez convertir entre les systèmes de coordonnées. ICI est quelques bonnes infos sur la façon dont une
SVGMatrix
œuvres. La chose importante à savoir pour l'instant est qu'unSVGMatrix
est un objet avec six propriétésa
b
c
d
e
etf
qui représentent une transformation de la façon suivante:Permet de dire que vous avez une variable
svgDoc
qui est une référence au document svg (pas un d3 de la sélection, mais l'élément lui-même). Ensuite, vous pouvez créer une fonction qui va convertir le système de coordonnées de l'élément svgelem
comme suit.Alors, de dire que tu voulais mettre un point au milieu de
elem
vous pourriez faire quelque chose comme ceci:bien sûr, vous souhaiterez probablement de les généraliser laconvertCoords
fonction de sorte que vous pouvez passer à l'élément cible, mais j'espère que vous aurez éteint dans la bonne direction. Bonne chance!Une meilleure mise en œuvre serait une usine qui génère une fonction de conversion pour chaque élément, et le document svg contexte:
Il pourrait être utilisé comme suit compte tenu de la même
elem
etsvgDoc
que les naïfs exemple:Pour obtenir les limites d'un élément SVG, vous avez deux options:
getBBox()
qui fonctionne sur tous les (graphique) éléments SVG. Il obtient la boîte englobante de l'élément dans le repère local de l'espace. Si l'élément a untransform
attribut, il aura une incidence sur la bbox, mais si le parent de l'élément a untransform
il ne sera pas reflétée dans la bbox retourné.http://www.w3.org/TR/SVG/types.html#InterfaceSVGLocatable
getBoundingClientRect()
qui est un Élément HTML en fonction, mais fonctionne également pour les éléments SVG. Il renvoie les limites de l'élément dans l'espace de l'écran (après toutes les transformations ont été appliquées).https://developer.mozilla.org/en-US/docs/Web/API/Element.getBoundingClientRect
D3 dispose d'une fonction intégrée pour analyser svg transforme:
d3.transformer
Vous pouvez l'utiliser pour obtenir le traduire array ([x, y]) de la transformation, c'est à dire:
@Jshanley excellente réponse est en fait très facilement mis en œuvre dans les premières JavaScript (ou un cadre) à l'aide de SVGPoint de la matrice de transformation.
Voir aussi:
Rectangle de coordonnées après transformation
Afin de trouver les bords de votre cercle, par exemple:
Certes pas très intéressant avec un simple cercle, mais une fois que le cercle a été déplacé ou étiré, il est un outil formidable pour obtenir les coordonnées.
W3 Spec
Microsoft est plus facile à comprendre tutoriel
Belle démo ici: https://codepen.io/netsi1964/pen/pWjwgP