如何使笔画宽度不受当前转换矩阵的影响

xan*_*xan 36 svg postscript coordinate-transformation

在SVG(和Canvas,Quartz,Postscript,...)中,变换矩阵影响路径坐标和线宽.有没有办法进行调整,以便线宽不受影响?也就是说,在下面的例子中,X和Y的比例是不同的,这使得正方形成为一个矩形,这是正常的,但它也使得两边的线条更宽.

  <g transform="rotate(30) scale(5,1) ">
      <rect x="10" y="10" width="20" height="20" 
            stroke="blue" fill="none" stroke-width="2"/>
  </g>
Run Code Online (Sandbox Code Playgroud)

矩形宽度缩放笔

我可以看到这在许多情况下都很有用,但有没有办法选择退出呢?我想我想要一个单独的笔TM或者能够将笔设置为CTM转换为圆形的椭圆,但我没有看到类似的东西.

缺乏这一点,我想我不得告诉SVG关于我的CTM而是自己转换坐标,这意味着将基元转换rect成它们的path等价物.

Rus*_*ser 45

编辑:

您可以添加一个属性到rect以获得完全相同的行为:

vector-effect="non-scaling-stroke"
Run Code Online (Sandbox Code Playgroud)

这是错的:

如果您将变换直接应用于形状而不是它所在的组,这将起作用.当然,如果您想要将多个项目组合在一起并将它们全部缩放,那么这种方法将无效.

<rect x="10" y="10" width="20" height="20" 
            stroke="blue" fill="none" stroke-width="2"
            transform="rotate(30) scale(5,1)"/>
Run Code Online (Sandbox Code Playgroud)

这可能还取决于您的SVG查看器; Inkscape以您想要的方式呈现文件(笔划宽度不受比例影响),但Chrome会按照您的显示进行渲染.

  • 好的,我找到了一个更好的答案[这里](http://www.w3.org/TR/SVGTiny12/painting.html#NonScalingStroke). (5认同)

lus*_*oog 6

在postscript中,描述路径和执行笔划是单独的事件,因此完全有可能有一个单独的"笔"TM.

%!PS
%A Funky Shape

matrix currentmatrix %save normal matrix for stroke pen
306 396 translate
72 72 scale
1 1 5 { pop
    360 5 div rotate
    1 0 translate
    0 0 moveto
    1 1 5 { pop
        360 5 div rotate
        1 0 translate
        1 0 lineto
        -1 0 translate
    } for
    -1 0 translate
    closepath
} for
setmatrix
[ 1 -3 4 2 0 0 ] concat %put some skew in the pen
10 rotate     %makes it look more "organic"
stroke
showpage
Run Code Online (Sandbox Code Playgroud)