SVG坐标系

50 阅读3分钟

数学坐标系与网格坐标系

数学坐标系

众所周知,数学上的坐标系统,大部分是指 笛卡尔直角坐标系

这种坐标系特点是:x轴向右,y轴向上,角度为逆时针





网格坐标系





有许多计算机绘图都使用网格坐标系(Canvas、SVG、Css3-transform二位坐标系等),这种坐标系的特点有:

1.左上角为网格坐标系原点(0, 0)

2.X 轴的正方向向右,Y 轴的正方向向下,角度为顺时针。

3.坐标以像素为单位





<svg viewbox="0, 0, 300, 300" style="border: 1px solid steelblue; position: relative; left: 100px; top: 100px;">
    <rect x="0" y="0" width="100" height="100" fill='green' />
</svg>

以 0,0 为起始点,在长宽都为300的画布上,画一个 100 * 100 的矩形,填充绿色

SVG坐标系

我们现在重点来分析SVG的坐标系统。在SVG中,共有四种坐标系:

1.用户坐标系

2.自身坐标系

3.前驱坐标系

4.参考坐标系

一.用户坐标系

用户坐标系也可以称为svg坐标系。

viewBox与视窗坐标系

viewBox 语法 viewBox =

  1. 平移







<svg width="100" height="100" style="outline: 1px solid green">
  <circle x="0" y="0" r="50" fill="red" />
</svg>

添加viewBox="-50 -50 100 100",将圆形移动到视窗内

<svg width="100" height="100" viewBox="-50 -50 100 100" 
    style="outline: 1px solid green">
  <circle x="0" y="0" r="50" fill="red" />
</svg>

通过改变viewBox的min-x和min-y,实现了将视窗向左向上进行平移,从而看到一个完整的圆。





2.缩放





通过改变viewBox的width和height可以缩放viewBox指定的区域。

<svg width="100" height="100" viewBox="0 0 100 100" style="outline: 1px solid green">
  <circle cx="0" cy="0" r="50" fill="red" />
</svg>

如图1-图2,将viewBox的width和height从100改为50,也就是使viewBox的宽高小于视窗的宽高,可以实现圆形的视觉放大。同理,当viewBox的宽高大于视窗的宽高,可以实现圆形视觉的缩小。

<svg width="100" height="100" viewBox="0 0 50 50" style="outline: 1px solid green">
  <circle cx="0" cy="0" r="50" fill="red" />
</svg>

二.自身坐标系

图形元素或分组本身具有的坐标系

在下图中,rect坐标系与svg网格坐标系(用户坐标系)都是重合的。





三.前驱坐标系





即父级坐标系。自身坐标系不发生变换的情况下,和前驱坐标系是重合的。

如下图,rect 变换后自身坐标系是蓝色部分,rect的前驱坐标系即svg坐标系(用户坐标系)。





四.参考坐标系

参考坐标系是相对概念,没有特指是哪种坐标系。上图中,用户坐标系可以作为rect的参考坐标系。当参考坐标系发生变化,坐标值要重新计算。





例如上图中,如果粉色rect2以蓝色rect1的为参考坐标系,rect2的左上角坐标应该为(20, 20);如果以用户坐标系作为rect2的参考坐标系,rect2的坐标应为(50,50)。



综合举例:





如图所示,用户坐标系为OA,g标签的坐标系经过translate向下平移30单位后,来到OB的位置,OC和OD的坐标系与OB重合,元素C和D的偏移量都是是相对于OB这个前驱(父级)坐标系来操作的。

还有一个要注意的点是,g标签代表的是元素分组,它本身的作用范围(2个rect外层的红色边框)是由内部元素决定的,但是g的坐标系是OB,是2个不同的概念。