Sono riuscito a trovare la lunghezza dei percorsi in svg, ma ora voglio trovare la lunghezza per i tag line, rect, poligono e circle da SVG, Sono davvero perso in questo momento e indizi? o ci sono già alcune funzioni come quella del percorso?Ottieni la lunghezza di una riga SVG, tag rettangolo, poligono e cerchio
risposta
Nel caso in cui nessun altro vuole trovare la lunghezza del questi tag ho creato alcune funzioni per ciascuno di essi, li ho testati e ho detto che funzionano abbastanza bene, questo era quello di cui avevo bisogno.
var tools = {
/**
*
* Used to get the length of a rect
*
* @param el is the rect element ex $('.rect')
* @return the length of the rect in px
*/
getRectLength:function(el){
var w = el.attr('width');
var h = el.attr('height');
return (w*2)+(h*2);
},
/**
*
* Used to get the length of a Polygon
*
* @param el is the Polygon element ex $('.polygon')
* @return the length of the Polygon in px
*/
getPolygonLength:function(el){
var points = el.attr('points');
points = points.split(" ");
var x1 = null, x2, y1 = null, y2 , lineLength = 0, x3, y3;
for(var i = 0; i < points.length; i++){
var coords = points[i].split(",");
if(x1 == null && y1 == null){
if(/(\r\n|\n|\r)/gm.test(coords[0])){
coords[0] = coords[0].replace(/(\r\n|\n|\r)/gm,"");
coords[0] = coords[0].replace(/\s+/g,"");
}
if(/(\r\n|\n|\r)/gm.test(coords[1])){
coords[0] = coords[1].replace(/(\r\n|\n|\r)/gm,"");
coords[0] = coords[1].replace(/\s+/g,"");
}
x1 = coords[0];
y1 = coords[1];
x3 = coords[0];
y3 = coords[1];
}else{
if(coords[0] != "" && coords[1] != ""){
if(/(\r\n|\n|\r)/gm.test(coords[0])){
coords[0] = coords[0].replace(/(\r\n|\n|\r)/gm,"");
coords[0] = coords[0].replace(/\s+/g,"");
}
if(/(\r\n|\n|\r)/gm.test(coords[1])){
coords[0] = coords[1].replace(/(\r\n|\n|\r)/gm,"");
coords[0] = coords[1].replace(/\s+/g,"");
}
x2 = coords[0];
y2 = coords[1];
lineLength += Math.sqrt(Math.pow((x2-x1), 2)+Math.pow((y2-y1),2));
x1 = x2;
y1 = y2;
if(i == points.length-2){
lineLength += Math.sqrt(Math.pow((x3-x1), 2)+Math.pow((y3-y1),2));
}
}
}
}
return lineLength;
},
/**
*
* Used to get the length of a line
*
* @param el is the line element ex $('.line')
* @return the length of the line in px
*/
getLineLength:function(el){
var x1 = el.attr('x1');
var x2 = el.attr('x2');
var y1 = el.attr('y1');
var y2 = el.attr('y2');
var lineLength = Math.sqrt(Math.pow((x2-x1), 2)+Math.pow((y2-y1),2));
return lineLength;
},
/**
*
* Used to get the length of a circle
*
* @param el is the circle element
* @return the length of the circle in px
*/
getCircleLength:function(el){
var r = el.attr('r');
var circleLength = 2 * Math.PI * r;
return circleLength;
},
/**
*
* Used to get the length of the path
*
* @param el is the path element
* @return the length of the path in px
*/
getPathLength:function(el){
var pathCoords = el.get(0);
var pathLength = pathCoords.getTotalLength();
return pathLength;
}
}
per semplificarti la vita ho creato un semplice plugin per animare i tratti svg, https://github.com/Zet-Tools/zPath.js – ZetCoby
grazie per il tuo codice, l'ho usato nel mio plugin SVG per consentire animazioni di tratti per elementi SVG aggiuntivi. Eccezionale! http://thednp.github.io/kute.js/svg.html#draw-example – thednp
bello! se stai cambiando 'el.attr()' jQuery funziona con 'el.getAttribute()' funziona con vanilla JavaScript;) e anche per il percorso devi solo restituire la funzione nativa 'el.getTotalLength()') – qdev
penso che si sta guardando il problema in modo non corretto:
lunghezza rectangle = 2 * (width + height)
lunghezza della linea (utilizzare teorema di Pitagora per qualsiasi non verticale linea c^2 = a^2 + b^2) o utilizzare (x1 a x2) per orizzontale (Y1 a Y2) per verticale
lunghezza cerchio = 2 × π × raggio ... ecc
hai ragione, non ho pensato questo ed è così semplice ... grazie – ZetCoby
Ho cercato di usare la risposta specificato da ZetCoby per i poligoni, ma nei test ho trovato che la lunghezza del percorso ritorna è sbagliato.
Esempio:
<polygon points="10.524,10.524 10.524,24.525 24.525,24.525 24.525,10.524" style="fill:none;stroke-width:0.2;stroke:black"></polygon>
Il poligono sopra dovrebbe avere una lunghezza di 56
, ma la funzione getPolygonLength(el)
restituisce un valore 61.79898987322332
.
Ho scritto un algoritmo per calcolare correttamente la lunghezza del percorso di un poligono SVG, quindi ho pensato di doverlo restituire poiché questo è il primo hit su google durante la ricerca di questo problema.
Ecco la mia funzione. Godetevi ...
function polygon_length(el) {
var points = el.attr('points');
points = points.split(' ');
if (points.length > 1) {
function coord(c_str) {
var c = c_str.split(',');
if (c.length != 2) {
return; // return undefined
}
if (isNaN(c[0]) || isNaN(c[1])) {
return;
}
return [parseFloat(c[0]), parseFloat(c[1])];
}
function dist(c1, c2) {
if (c1 != undefined && c2 != undefined) {
return Math.sqrt(Math.pow((c2[0]-c1[0]), 2) + Math.pow((c2[1]-c1[1]), 2));
} else {
return 0;
}
}
var len = 0;
// measure polygon
if (points.length > 2) {
for (var i=0; i<points.length-1; i++) {
len += dist(coord(points[i]), coord(points[i+1]));
}
}
// measure line or measure polygon close line
len += dist(coord(points[0]), coord(points[points.length-1]));
return len;
} else {
return 0;
}
}
Grazie a @swill, eseguirò un doppio controllo su tutti i metodi per assicurarmi che restituisca la lunghezza corretta, e se va bene con te, mi piacerebbe usare la tua soluzione nel mio plugin. – ZetCoby
Sentiti libero di usare la mia soluzione.Grazie per aver messo il lavoro nel tentativo di risolvere questo per gli altri. :) – swill
In SVG 2 tutti gli elementi della geometria avranno una proprietà lunghezza di percorso, ma come di maggio 2017 questo è ancora da attuare nella maggior parte dei browser.
Vedere https://developer.mozilla.org/en-US/docs/Web/API/SVGGeometryElement per ulteriori informazioni.
Possiamo futuro risposta s' prova @zetcoby con:
if(el.pathLength) {
return el.pathLength;
}
else {
// rest of code...
}
- 1. Collisione tra cerchio e poligono con Libgdx
- 2. Ottieni la lunghezza in pixel di stringa in Svg
- 3. Ottieni la lunghezza dell'array?
- 4. XNA ha un poligono, come il rettangolo?
- 5. Evento click per rettangolo SVG
- 6. SVG - cerchio scala dal centro
- 7. D3 come modificare la larghezza e la lunghezza SVG
- 8. SVG centro testo nel cerchio
- 9. Immagine SVG all'interno del cerchio
- 10. Esempi di poligoni tracciati per tracciato e poligono in SVG
- 11. Disegna rettangolo/cerchio e triangolo in Spritekit con due colori. . .
- 12. Punto in poligono controlla con SVG e JavaScript?
- 13. Calcolo del rettangolo con un angolo di un poligono
- 14. JavaScript Ottieni la lunghezza reale di una stringa (senza entità)
- 15. Come posizionare forme svg in un cerchio?
- 16. Disegna un cerchio vuoto in SVG
- 17. Trovare un rettangolo allineato agli assi all'interno di un poligono
- 18. Cerca e ottieni una riga in Python
- 19. svg cerchio non viene disegnato con javascript
- 20. CircledImageView ha sempre un'immagine di rettangolo davanti al cerchio
- 21. Trova elementi all'interno cerchio in svg
- 22. Stroke lato destro e sinistro del rettangolo svg
- 23. Come si ridimensiona un poligono SVG in ems?
- 24. Ottieni lunghezza dell'array JSON.Net
- 25. Delphi image canvas ... dipingi un'area (triangolo, rettangolo, poligono)
- 26. Opuscolo :: Come verificare il punto all'interno o all'esterno del poligono o del rettangolo
- 27. Ottieni gli angoli di un rettangolo rotante
- 28. SVG trascinabile utilizzando JQuery e Jquery-svg
- 29. controllo Javascript Mouse cliccato all'interno del cerchio o poligono
- 30. Ottieni larghezza e altezza di una riga in RecycleView - Android
quello che voglio fare è aggiungere dasharray e dashoffset ad ognuno di loro, ma ho bisogno la lunghezza esatta, al fine di renderli invisibili, voglio fare l'effetto del disegno ma per questi tag anche – ZetCoby
potrei convertirli tutti in percorsi usando inkscape ma questa è solo una soluzione, voglio farlo in questo modo se è possibile – ZetCoby