<?xml version="1.0" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg width="4cm" height="4cm" viewBox="0 0 400 400" xmlns="http://www.w3.org/2000/svg" version="1.1"> <title>Example triangle01- simple example of a 'path'</title> <desc>A path that draws a triangle</desc> <rect x="1" y="1" width="398" height="398" fill="none" stroke="blue" /> <path d="M 100 100 L 300 100 L 200 300 z" fill="red" stroke="blue" stroke-width="3" />
</svg>
命令
|
名称
|
参数
|
描述
|
M (absolute)
m (relative) |
moveto
|
(x y)+
|
从给定的(x,y)坐标开启一个新的子路径或路径。M表示后面跟随的是绝对坐标值。
m表示后面跟随的是一个相对坐标值。如果"moveto"指令后面跟随着多个坐标值,那么
这多个坐标值之间会被当做用线段连接。因此如果moveto是相对的,那么lineto也将会
是相对的,反之也成立。如果一个相对的moveto出现在path的第一个位置,那么它会
被认为是一个绝对的坐标。在这种情况下,子序列的坐标将会被当做相对的坐标,即便
它在初始化的时候是绝对坐标。
|
指令
|
名称
|
参数
|
描述
|
Z or
z |
closepath
|
无参数
|
通过从当前点到当前路径的起始点画一条线段来关闭当前的路径。Z和z指令都没有参数,
但是它们有相同的效果。
|
指令
|
名称
|
参数
|
描述
|
L (absolute)
l (relative) |
lineto
|
(x y)+
|
画一条从当前点到给定的(x,y)坐标,这个给定的坐标将变为新的当前点。L表示后面
跟随的参数将是绝对坐标值;l表示后面跟随的参数将是相对坐标值。可以通过指定一系
列的坐标来描绘折线。在命令执行后,新的当前点将会被设置成被提供坐标序列的最后
一个坐标。
|
H (absolute)
h (relative) |
horizontal lineto
|
x+
|
从(cpx,cpy)画一个水平线到(x,cpy)。H表示后面跟随的参数是绝对的坐标,h表示
后面跟随的参数是相对坐标。可以为其提供多个x值作为参数。在指令执行结束后,
最新
的当前点将是参数提供的最后值(x,cpy)
|
V (absolute)
v (relative) |
vertical lineto
|
y+
|
从当前点(cpx,cpy)到(cpx,y)画一条竖直线段。V表示后面的参数是绝对坐标
值,v表示后面跟着的参数是相对坐标值。可以供多个y值作为参数使用。在指令的最
后,根据最后的参数y值最新的当前点的坐标值是(cpx,y).
|
指令
|
名称
|
参数
|
描述
|
C (absolute)
c (relative) |
curveto
|
(x1 y1 x2 y2 x y)+
|
在曲线开始的时候,用(x1,y1)作为当前点(x,y)的控制点,
在曲线结束的时候,
用(x2,y2)作为当前点的控制点,
画一段立方体的贝塞尔曲线。C表示
后面跟随的参数是绝对坐标值;
c表示后面跟随的参数是相对坐标值。可以为贝塞尔函数提供多个参数
值。在指令执行完毕后,最后的当前点将变为在贝塞尔函数中只用的
最后的(x,y)坐标值
|
S (absolute)
s (relative) |
shorthand/smooth curveto
|
(x2 y2 x y)+
|
从当前点(x,y)画一个立方体的贝塞尔曲线。相对于当前点,
第一个控制点被认为是前面命令的第二个控制点的反射。(如果
前面没有指令或者指令不是C, c, S 或者s,那么就认定当前点和
第一个控制点是一致的。)(x2,y2)是第二个控制点,控制
着曲线结束时的变化。S表示后面跟随的参数是绝对的坐标值。
s表示后面跟随的参数是相对的坐标值。多个值可以作为
贝塞尔函数的参数。在执行执行完后,最新的当前点是在贝塞尔函数中
使用的最后的(x,y)坐标值。
|
<?xml version="1.0" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg width="5cm" height="4cm" viewBox="0 0 500 400" xmlns="http://www.w3.org/2000/svg" version="1.1"> <title>Example cubic01- cubic Bézier commands in path data</title> <desc>Picture showing a simple example of path data using both a "C" and an "S" command, along with annotations showing the control points and end points</desc> <style type="text/css"><![CDATA[ .Border { fill:none; stroke:blue; stroke-width:1 } .Connect { fill:none; stroke:#888888; stroke-width:2 } .SamplePath { fill:none; stroke:red; stroke-width:5 } .EndPoint { fill:none; stroke:#888888; stroke-width:2 } .CtlPoint { fill:#888888; stroke:none } .AutoCtlPoint { fill:none; stroke:blue; stroke-width:4 } .Label { font-size:22; font-family:Verdana } ]]></style> <rect class="Border" x="1" y="1" width="498" height="398" /> <polyline class="Connect" points="100,200 100,100" /> <polyline class="Connect" points="250,100 250,200" /> <polyline class="Connect" points="250,200 250,300" /> <polyline class="Connect" points="400,300 400,200" /> <path class="SamplePath" d="M100,200 C100,100 250,100 250,200 S400,300 400,200" /> <circle class="EndPoint" cx="100" cy="200" r="10" /> <circle class="EndPoint" cx="250" cy="200" r="10" /> <circle class="EndPoint" cx="400" cy="200" r="10" /> <circle class="CtlPoint" cx="100" cy="100" r="10" /> <circle class="CtlPoint" cx="250" cy="100" r="10" /> <circle class="CtlPoint" cx="400" cy="300" r="10" /> <circle class="AutoCtlPoint" cx="250" cy="300" r="9" /> <text class="Label" x="25" y="70">M100,200 C100,100 250,100 250,200</text> <text class="Label" x="325" y="350" style="text-anchor:middle">S400,300 400,200</text> </svg>
效果图像:
用SVG查看效果图 (只能使用可以查看SVG的浏览器才可以正常查看)
7.二次贝塞尔曲线指令
二次贝塞尔曲线指令如下所示:
指令
|
名称
|
参数
|
描述
|
Q (absolute)
q (relative)
|
quadratic Bézier curveto
|
(x1 y1 x y)+
|
从当前点(x,y)开始,以(x1,y1)为控制点,画出一个二次贝塞尔曲线。
Q表
示后面跟随的参数是绝对坐标值,q表示后面跟随的参数是相对坐标值。
可以为贝塞尔函数指定
多个参数值。在指令执行结束后,新的当前点是贝塞尔曲线
调用参数中最后一个坐标值
(x,y)。
|
T (absolute)
t (relative)
|
Shorthand/smooth quadratic Bézier curveto
|
(x y)+
|
画一个从当前点到(x,y)的二次贝塞尔曲线。控制点被认为是上一个
指令的控制点以当前点为中心的对称点。(如果前面没有指令或者前面
的指令不是Q, q, T或者t,那么
控制点被认为是当前点
)。T表示后面跟随
的参数是绝对坐标值;t表示后面跟随的参数是相对坐标值。在指令执行结束后,
新的当前点被认定为最后传递给贝塞尔函数的坐标值(x,y)。
|
下面的例子展示了如何简单的使用二次贝塞尔曲线。注意T指令的控制点来源于前面Q指令控制点以T指令当前点的对称点。
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="12cm" height="6cm" viewBox="0 0 1200 600"
xmlns="http://www.w3.org/2000/svg" version="1.1">
<title>Example quad01 - quadratic Bézier commands in path data</title>
<desc>Picture showing a "Q" a "T" command,
along with annotations showing the control points
and end points</desc>
<rect x="1" y="1" width="1198" height="598"
fill="none" stroke="blue" stroke-width="1" />
<path d="M200,300 Q400,50 600,300 T1000,300"
fill="none" stroke="red" stroke-width="5" />
<!-- End points -->
<g fill="black" >
<circle cx="200" cy="300" r="10"/>
<circle cx="600" cy="300" r="10"/>
<circle cx="1000" cy="300" r="10"/>
</g>
<!-- Control points and lines from end points to control points -->
<g fill="#888888" >
<circle cx="400" cy="50" r="10"/>
<circle cx="800" cy="550" r="10"/>
</g>
<path d="M200,300 L400,50 L600,300
L800,550 L1000,300"
fill="none" stroke="#888888" stroke-width="2" />
</svg>
生成图像结果:
8椭圆弧曲线指令
椭圆弧曲线指令如下所示:
指令
|
名称
|
参数
|
描述
|
A (absolute)
a (relative)
|
elliptical arc
|
(rx ry x-axis-rotation large-arc-flag sweep-flag x y)+
|
用来从当前点(x,y)来画出一个椭圆弧曲线。曲线的形状和方向通过椭圆半径(rx,ry)
和一个沿X轴旋转度来指明椭圆作为一个整体在当前坐标系下旋转的情形。椭圆的中心
(cx,cy)是通过满足其他参数的约束自动计算出来的。
large-arc-flag和sweep-flag
决定了计算和帮助要画的弧度大小。
|
参数具体详解rx ry:一个椭圆的x轴半径和y轴半径
x-axis-rotation:椭圆的X轴与当前坐标系X轴之间的角度
large-arc-flag :弧线选择是大弧度的曲线还是小弧度的曲线,1标识大的弧线,0标识小的弧线
sweep-flag:从当前点到(x,y)的弧线是顺时针的还是逆时针的,逆时针为0,顺时针为1
x y:指令的目标点
下面的例子展示了在一段路径中使用指令的情况:
<?xml version="1.0" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg width="12cm" height="5.25cm" viewBox="0 0 1200 400" xmlns="http://www.w3.org/2000/svg" version="1.1"> <title>Example arcs01 - arc commands in path data</title> <desc>Picture of a pie chart with two pie wedges and a picture of a line with arc blips</desc> <rect x="1" y="1" width="1198" height="398" fill="none" stroke="blue" stroke-width="1" /> <path d="M300,200 h-150 a150,150 0 1,0 150,-150 z" fill="red" stroke="blue" stroke-width="5" /> <path d="M275,175 v-150 a150,150 0 0,0 -150,150 z" fill="yellow" stroke="blue" stroke-width="5" /> <path d="M600,350 l 50,-25 a25,25 -30 0,1 50,-25 l 50,-25 a25,50 -30 0,1 50,-25 l 50,-25 a25,75 -30 0,1 50,-25 l 50,-25 a25,100 -30 0,1 50,-25 l 50,-25" fill="none" stroke="red" stroke-width="5" /> </svg>
SVG图像的结果如下所示:
椭圆弧曲线需要满足下面的约束条件之后才可以画出一个椭圆的片段:
弧线从当前点开始
弧线以(x,y)为结束点
椭圆有两个半径,(rx,ry)
椭圆的x轴相对于当前坐标系的x轴通过X轴旋转度旋转
在大多数情况下有4个不同的弧曲线会满足约束条件。large-arc-flag和 sweep-flag决定了这四个当中哪一个被画出,如下所示:
在这四段弧线当中,两段将比其余的两段大180度或者等于180度。剩余的两段比前面的两段小180度或者等于180度。如果large-arc-flag是1,表示两个比较大的弧线被选择出来;否则如果是0,那么较小的弧线被选择出来。
如果sweep-flag是1,那么弧线将会以一个合适的通过(椭圆公式x=cx+rx*cos(theta)和y=cy+ry*sin(theta))评测出一个当前点起始,逐步增长到(x,y)结束的角度描绘出来。值为0会导致弧线会在负角度方向被画出。(theta从当前点开始并增长到(x,y)结束弧线。)
下面是large-arc-flag和sweep-flag的组合图解,并展示了基于四种不同结果的图形。对每个情况,可以使用下面的指令:
<path d="M 125,75 a100,50 0 ?,? 100,50" style="fill:none; stroke:red; stroke-width:6"/>
当里面的"?,?"被替换为"0,0" "0,1" "1,0" "1,1"时会形成四种可能的结果: