How to draw non-scalable circle in SVG with Javascript

后端 未结 4 1815
星月不相逢
星月不相逢 2020-12-16 20:51

I\'m developing a map, in Javascript using SVG to draw the lines.

I would like to add a feature where you can search for a road, and if the road is found, a circle a

4条回答
  •  臣服心动
    2020-12-16 21:01

    Looks like some work was done in webkit (maybe related to this bug: 320635) and the new transform doesn't stick around when simply appended like that

    transform.baseVal.appendItem
    

    This seems to work better. Even works in IE 10.

    EDIT: Fixed the code for more general case of multiple translate transformations in the front and possible other transformations after. First matrix transformation after all translates must be reserved for unscale though.

    translate(1718.07 839.711) translate(0 0) matrix(0.287175 0 0 0.287175 0 0) rotate(45 100 100)

    function unscale()
    {
        var xf = this.ownerSVGElement.createSVGTransform();
        var m = this.ownerSVGElement.getTransformToElement(this.parentNode);
        m.e = m.f = 0; // Ignore (preserve) any translations done up to this point
        xf.setMatrix(m);
    
        // Keep a single transform matrix in the stack for fighting transformations
        // Be sure to apply this transform after existing transforms (translate)
        var SVG_TRANSFORM_MATRIX = 1;
        var SVG_TRANSFORM_TRANSLATE = 2;
        var baseVal = this.transform.baseVal;
        if(baseVal.numberOfItems == 0)
            baseVal.appendItem(xf);
        else
        {
            for(var i = 0; i < baseVal.numberOfItems; ++i)
            {
                if(baseVal.getItem(i).type == SVG_TRANSFORM_TRANSLATE && i == baseVal.numberOfItems - 1)
            {
                    baseVal.appendItem(xf);
                }
    
                if(baseVal.getItem(i).type != SVG_TRANSFORM_TRANSLATE)
                {
                    if(baseVal.getItem(i).type == SVG_TRANSFORM_MATRIX)
                        baseVal.replaceItem(xf, i);
                    else
                        baseVal.insertItemBefore(xf, i);
                    break;
                }
            }
        }
    }
    

    EDIT2: Chrome killed getTransformToElement for some reason, so the matrix needs to be retrieved manually:

    var m = this.parentNode.getScreenCTM().inverse().multiply(this.ownerSVGElement.getScreenCTM());
    

提交回复
热议问题