SVG方向:使用SVG绘制不同图形,理解path路径命令以及深刻理解两种fill-rule规则

1、SVG的介绍

SVG是可以在网页中绘制复杂的图形

1.1、svg与canvas画布的区别

计算机中图像的类型分为两种,位图和矢量图。
位图是由像素点组合而成的图像,一个点就是一个像素,每个点都有自己的颜色,位图也与分辨率有直接的联系,分辨率大的位图清晰度高,其放大倍数清晰度也对应的提高,但是,当位图的放大倍数超过最佳分辨率时,就会出现细节丢失,产生锯齿状边缘的情况。
矢量图是通过数学的一种方式,其内容以线条和色块为主,矢量图跟分辨率无关,它可以任意的放大且清晰度不变,也不会有锯齿状边缘。
SVG是矢量图的形式呈现,是根据数学计算得来的,而canvas画布是以位图的形式呈现,其次,SVG是基于XML的,而canvas是基于H5。

2、使用SVG

2.1、创建svg文件

svg是基于XML的,因此需要先创建XML模板文件,然后引入相关的SVG标签进行搭建基本的svg绘图框架

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg">
    
</svg>
2.2、或直接嵌入到HTML页面中
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <svg xmlns="http://www.w3.org/2000/svg">
            <circle cx='100' cy='100' r='70' fill='green'>
            </circle>
        </svg>
    </body>
</html>
绘制圆.png

其中cx是圆心点离X轴原点的距离,cy是圆心点离Y轴原点的距离,r是半径,fill是填充的颜色。


绘制圆.png

3、不同图形的不同属性

3.1、圆形(<circle></circle>)
属性 属性说明
cx 圆心离坐标轴原点x方向的距离
cy 圆心离坐标轴原点y方向的距离
r 半径大小
fill 图片填充的颜色
stroke 外部轮廓的边框
stroke-width 外部轮廓的边框的大小
transparent 图形内部设置透明
<svg xmlns="http://www.w3.org/2000/svg">
    <circle cx='100' cy='100' r='70'  stroke='red' fill='transparent' stroke-width='5'>
    </circle>
</svg>
透明的带边框的原形.png
3.2、矩形(<rect></rect>)
属性 属性说明
x 矩形中心点离坐标轴原点x方向的距离
y 矩形中心点离坐标轴原点y方向的距离
width 矩形的宽度
height 矩形的高度
rx 弧度椭圆的x长度
ry 弧度椭圆的y长度
fill 图片填充的颜色
stroke 外部轮廓的边框
stroke-width 外部轮廓的边框的大小
transparent 图形内部设置透明
<rect width="300" height="100" x='100' y='100' fill='transparent' rx='40' ry='30' stroke='red' stroke-width='5'>                
</rect>
rx和ry属性解释.png
3.3、椭圆(<ellipse></ellipse>)
属性 属性说明
cx 定义的椭圆中心的x坐标
cy 定义的椭圆中心的y坐标
rx 定义的水平半径
ry 定义的垂直半径
fill 图片填充的颜色
stroke 外部轮廓的边框
stroke-width 外部轮廓的边框的大小
transparent 图形内部设置透明
<ellipse cx='200' cy='100' rx='100' ry='35' fill='transparent'  stroke='red' stroke-width='5' > 
</ellipse>
属性说明png
3.4、线(<line></line>)
属性 属性说明
x1 第一个点离坐标轴原点x方向的距离
y1 第一个点离坐标轴原点y方向的距离
x2 第二个点离坐标轴原点x方向的距离
y2 第二个点离坐标轴原点y方向的距离
stroke 线条的颜色
stroke-width 线条的粗细大小
stroke-opacity 线条设置透明度
<line x1='10' y1='10' x2='100' y2='50' stroke='#000' stroke-width='5' stroke-opacity='0.5'> 
</line>
线条.png
3.5、折线(<polyline></polyline>)
属性 属性说明
points 所有点的集合
fill 不希望起始点连起来有填充颜色的话设置为null
stroke 线条的颜色
stroke-width 线条的粗细大小
stroke-opacity 线条设置透明度
<polyline points='50,50 100,50 100,100 150,100 150,150 200,150 200,200 250,200' fill='none' stroke='red' stroke-width='5' > 
</polyline>
image.png
3.6、多边形(<polygon></polygon>)
属性 属性说明
points 所有点的集合
fill 设置为lime
stroke 线条的颜色
stroke-width 线条的粗细大小
stroke-opacity 线条设置透明度
fill-rule 填充规则
fill-rule 属性提供两种选项用于指定如何判断图形的“内部”
  • nonzero:起始值为0,射线会和路径相交,如果路径方向和射线方向形成的是顺时针方向则+1,如果是逆时针方向则-1,最后如果数值为0,则是路径的外部;如果不是0,则是路径的内部。
  • evenodd:起始值为0,射线会和路径相交,每交叉一条路径,我们计数就+1,最后看我们的总计算数值,如果是奇数,则认为是路径内部,如果是偶数,则认为是路径外部。
深刻理解两种规则:
  • nonzero判定原理
    nonzero内部.png

    nonzero外部.png
  • evenodd判定原理
    evenodd内部.png

    evenodd外部.png

最后,图形的代码部分:

<polygon points='50,50 500,50 300,200 50,50 50,100 200,50' fill='lime' stroke='red' fill-rule='evenodd' stroke-width='5' >  
</polygon>
3.7、路径(<path></path>)

路径是通过d属性绘制而成的,d属性的第一个命令必须是移动命令(即M)
小写的命令的话描述与大写字母一致,只是使用的坐标是相对坐标。

指令 参数 名称 描述
M x,y moveto 移动到 移动虚拟画笔到指定的(x,y)坐标,仅移动不绘制
L x,y lineto 连直线到 从当前画笔所在位置绘制一条直线到指定的(x,y)坐标
H x horizontal lineto 水平连线到 绘制一条水平直线到参数指定的x坐标点,y坐标为画笔的y坐标
V y vertical lineto 垂直连线到 从当前位置绘制一条垂直直线到参数指定的y坐标
C x1,y1 x2,y2 x,y curveto 三次方贝塞尔曲线 从当前画笔位置绘制一条三次贝兹曲线到参数(x,y)指定的坐标。x1,y1和x2,y2是曲线的开始和结束控制点,用于控制曲线的弧度
S x2,y2 x,y shorthand / 平滑三次方贝塞尔曲线 从当前画笔位置绘制一条三次贝塞尔曲线到参数(x,y)指定的坐标。x2,y2是结束控制点。开始控制点和前一条曲线的结束控制点相同
Q x1,y1 x,y 二次方贝塞尔曲线 从当前画笔位置绘制一条二次方贝塞尔曲线到参数(x,y)指定的坐标。x1,y1是控制点,用于控制曲线的弧度
T x,y 平滑的二次贝塞尔曲线 从当前画笔位置绘制一条二次贝塞尔曲线到参数(x,y)指定的坐标。控制点被假定为最后一次使用的控制点
A rx,ry x-axis-rotation large-arc-flag,sweepflag x,y 椭圆弧线 从当前画笔位置开始绘制一条椭圆弧线到(x,y)指定的坐标。rx和ry分别为椭圆弧线水平和垂直方向上的半径。x-axis-rotation指定弧线绕x轴旋转的度数。它只在rx和ry的值不相同是有效果。large-arc-flag是大弧标志位,取值0或1,用于决定绘制大弧还是小弧。sweep-flag用于决定弧线绘制的方向
Z 闭合路径 从结束点绘制一条直线到开始点,闭合路径
<path id="line1" d="M 100 150 l 150 300" stroke="red" stroke-width="3" fill="none" />
<path id="line2" d="M 250 450 l 150 -300" stroke="red" stroke-width="3" fill="none" />
<path d="M 100 150 q 150 300 300 0" stroke="blue" stroke-width="5" fill="none" />
路径.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容

  • 图片的认知 分为:位图和矢量图 位图位图是有一个个小方块组合的图片,一个小方块代表1px比如:jpg,png,gi...
    追逐_chase阅读 1,913评论 0 2
  • 使用XML描述的矢量文件W3C标准(1.1):http://www.w3.org/TR/SVG11/浏览器支持情况...
    没汁帅阅读 5,976评论 0 16
  • 概念: SVG 是一种基于 XML 语法的图像格式,全称是可缩放矢量图(Scalable Vector Graph...
    晨曦_f83d阅读 786评论 0 0
  • SVG 简介SVG 是使用 XML 来描述二维图形和绘图程序的语言。SVG 指可伸缩矢量图形 (Scalable ...
    benbensheng阅读 194评论 0 0
  • 一、SVG形状 SVG有一些预定义的形状元素,可被开发者使用和操作: 矩形 <rect>圆形 <circle>椭圆...
    LemonnYan阅读 15,968评论 0 18