Get the length of a SVG line,rect,polygon and circ

2019-06-20 03:57发布

I managed to find the length of the paths in svg, but now i want to find the length for the line, rect, polygon and circle tags from SVG, I am really lost right now, and clues ? or are there already some functions like there is for path?

4条回答
ゆ 、 Hurt°
2楼-- · 2019-06-20 04:38

I tried to use the answer specified by ZetCoby for polygons, but in testing I found that the path length it returns is wrong.

Example:

<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>

The the above polygon should have a length of 56, but the getPolygonLength(el) function returns a value of 61.79898987322332.

I wrote an algorithm to correctly calculate the path length of an SVG polygon, so I thought I should contribute it back since this is the first hit on google when searching for this problem.

Here is my function. Enjoy...

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;
  }
}
查看更多
ゆ 、 Hurt°
3楼-- · 2019-06-20 04:44

I think you are looking at the problem incorrectly :

length of rectangle = 2 * (width + height)

length of line ( use pythagorean theorem for any non vertical line c^2 = a^2 + b^2 ) or use ( x1 to x2 ) for horizontal , ( y1 to y2 ) for vertical

length of circle = 2 × π × radius ... etc

查看更多
做自己的国王
4楼-- · 2019-06-20 04:52

In case anyone else wants to find the length of these tags I made some functions for each of them, tested them and I say they work pretty ok, this was what i needed.

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;
            }
        }
查看更多
萌系小妹纸
5楼-- · 2019-06-20 04:59

In SVG 2 all geometry elements will have a pathLength property but as of May 2017 this is still to be implemented in most browsers.

See https://developer.mozilla.org/en-US/docs/Web/API/SVGGeometryElement for more info.

We can future proof @zetcoby 's answer with:

if( el.pathLength ) {
   return el.pathLength;
}
else {
    // rest of code...
}
查看更多
登录 后发表回答