python处理svg 平移 旋转_理解SVG transform坐标变换(转)

一、HTML transform和SVG transform

SVG中自带transform属性,没错,是属性,例如:

普通的HTML元素没有transform属性,但是支持CSS3的transform, 好奇的小伙伴可能会疑问了,CSS3中的transform变换,跟SVG中的transform是什么关系呢?

恩,有点类似于谢霆锋和陈冠希之间的关系,有些小复杂。

OK, 先说说相似之处吧。

一些基本的变换类型是一样的,包括:位移translate, 旋转rotate, 缩放scale, 斜切skew以及直接矩阵matrix. 但只局限于2D层面的变换。SVG似乎只支持二维变换(若有不对,欢迎指正),且类似translateX,rotateX也都是不支持的。

下面就是不一样的地方了:

1.CSS3transform一般用在普通元素上,虽然也可以应用在SVG元素上,但是IE浏览器(IE edge未测试)却不支持SVG元素;

rect {/* IE说:你这是弄啥来? */transform:rotate(45deg);}

2.HTML元素的CSS3 transform和SVG的transform坐标系统大相径庭;

平常我们使用transform其坐标是相对于当前元素而言的,默认是元素的中心点变换,我们可以通过transform-origin属性改变变换的中心点。而SVG中的transform的坐标变换的是相对于画布的左上角计算的,跟HTML的transform差别较大,理解上也更加麻烦。而本文就是彻底理清SVG中的transform到底是怎么工作的。

3.具体的语法细节有差异。SVGtransform属性语法有些自带偏移。而CSStransform则更加纯粹些。

//zxx: 据说CSS的transform和SVG的transform属性即将合并。

二、SVG transform translate位移

我们先来看下最简单最基本的translate位移变换,例如,我们偏移(295,115)大小的位置,HTML元素的偏移(下图左)和SVG元素的偏移(下图右)就会不一样。一个是相对自己的中心点(下图左),一个是SVG的左上角(下图右)。

虽然两者的相对位置不一样,但是,对于单纯地位移来讲,无论你相对于那个点位置,实际偏移的位置都是一样的,因此,从表现上讲,两者最终的位置看上去还是一样的。

前面我们提到过,SVG元素也能使用CSS3的transform进行变换(非IE浏览器),但是只能支持2D层面的几个属性,例如translateX(tx),translateY(ty)以及translate(tx[, ty]).translateZ(tz)则并不支持。

如果我们使用SVG元素自带的transform属性进行变换,则仅支持translate(tx[ ty])这种用法(缺省使用0代替),当多个参数值的时候,可以使用逗号,或者直接空格分隔,但是不能包含单位,例如下面这种写法直接翘辫子:

transform="translate(30px 12px)"

下面这种无单位写法才可以:

trans

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python turtle库不支持SVG fill_rule属性,但是可以通过一些方法模拟它的效果。 一种简单的方法是使用Python的绘图库,例如Pillow或OpenCV。这些库可以将SVG文件读入并绘制它们。然后,可以使用Python的算法来模拟fill_rule=”evenodd”。 另一种方法是使用Python turtle库中的pencolor函数,并使用“XOR”操作来模拟fill_rule=”evenodd”。当turtle遇到边界时,它将自动填充形状。然而,它没有内部的fill_rule选项来控制填充。 以下是一个使用“XOR”操作来模拟fill_rule=”evenodd”的例子: ``` import turtle def draw_shape(): turtle.penup() turtle.goto(0,0) turtle.pendown() turtle.begin_fill() turtle.fillcolor("red") # Draw shape here turtle.circle(50) turtle.end_fill() # XOR fill the shape turtle.pencolor("white") turtle.fillcolor("white") turtle.begin_fill() turtle.goto(0,0) turtle.pendown() turtle.circle(50) turtle.end_fill() draw_shape() ``` 在这个例子中,我们首先用红色填充一个圆形。然后,我们使用pencolor函数将笔的颜色设置为白色,使用fillcolor函数将填充颜色设置为白色,然后使用begin_fill函数开始一个新的填充。我们移动到圆形的中心,然后画出一个相同大小的圆形。这将使得两个圆形的重叠区域被“XOR”操作,形成一个“evenodd”填充的效果。最后,我们使用end_fill函数结束填充。 这个方法可能不是最完美的,但它是一种可以在Python turtle中模拟fill_rule=”evenodd”的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值