svg 和vml深入了解(路径path&shape)(转载)

 

目标:深入了解svg和vml的path属性
实现方式:代码及相关文字解释。希望能一步步写完代码当你看完也就掌握了。
先看两个例子分别了解一下svg和vml 的path用法。
VML:
[html]  view plain copy
  1. <html xmlns:v="urn:schemas-microsoft-com:vml">  
  2. <head>  
  3. <title>vml</title>  
  4. <style>v\: * {behavior:url(#default#vml);display:inline-block}</style>  
  5. </head>  
  6. <body>  
  7. <v:shape CoordSize='2000,2000' path='M50 150C50 100 250 100 250 150C250 200 350 200 350 150'style="width:1000px;height:1000px;position:absolute" />  
  8. </body>  
  9. </html>  
SVG:
[html]  view plain copy
  1. <!DOCTYPE html>  
  2. <html>  
  3. <head>  
  4. <title>SVG PATH</title>  
  5. </head>  
  6. <body>  
  7. <svg xmlns="http://www.w3.org/2000/svg">  
  8. <path d="M50 150C50 100 250 100 250 150C250 200 350 200 350 150"style="stroke:#660000; fill:none;"/>  
  9. </svg>  
  10. </body>  
  11. </html>  

SVG是path元素, 我们用d来定义路径,VML是shape元素,我们用path来定义路径。
下面我们分别把两种元素的参数罗列一下,然后挑重点分析。
SVG:
注:当元素名称大小写表示absolute(大写)或者relative(小写)
SVG:path
元素参数名称注释
Mx,ymove to开始的节点坐标。
Lx,y line to从当前节点到指定的lineto节点。
Hxhorizontal to可以理解为line to y坐标不变水平移动到x点。
Vvertical lineto可以理解为line to y坐标不变垂直移动到y点。
Cx1,y1 x2,y2 x,ycurvetox1,y1,x2,y2分别是当前节点和结束节点的控制点,x,y结束节点。
Sx2,y2 x,y smooth curvetox2,y2分别是结束节点的控制点,x,y结束节点。
Qx1,y1 x,y quadratic Bezier curvetox1,y1分别是当前节点的控制点,x,y结束节点。
Tx,y smooth quadratic Bezier curveto反射,就是指前面一个控制点相反的方向的控制点x,y
Arx,ry ,
x-axis-rotation,
large-arch-flag,
sweepflag,
x,y
elliptical arch从当前点到x,y画椭圆,rx,ry为长短半轴,x-axis-rotation 偏转角度,是否是大的圆弧(0,1),
sweepflag 顺时针还是逆时针(0,1).
Zclosepath关闭路径,将当前点和第一个点连线。

VML:
注:大小写都一样。
VML:shape
元素参数名称注释
x,ymove to开始的节点坐标。
Lx,yline to 从当前节点到指定的lineto节点。
Cx1,y1 x2,y2 x,ycurvetox1,y1,x2,y2分别是当前节点和结束节点的控制点,x,y结束节点。
Xclosepath关闭路径,将当前点和第一个点连线。
Eendpath结束路径
Tr move to不连线,从新起一个点
Rx,y r line to通过向量x,y得到终点并连线
VX1,Y1,X2,Y2,X,Yr curve to以当前节点通过x1,y1,x2,y2向量算出当前点和结束点的控制点,通过当前点向量x,y,算出结束点
nfno fill無填色(I.E.6.0)
nsno stroke無線條(I.E.6.0)
aeX,Y,Width,Height,Start,Endangle ellipse to画椭圆,X,Y圆心,width,height圆的长短半轴,start和end是开始角度和结束角度,360度360×2^16=23592960
alX,Y,Width,Height,Start,Endangle ellipse跟上面一样,只是如果path中前面有M坐标的画不会影响圆,圆会从新开始画。上面的如果有M坐标,会有一条连线
atLEFT,TOP,RIGHT,BOTTOM,
X1,Y1,X2,Y2
arc to逆时针画圆,LEFT,TOP,RIGHT,BOTTOM是给定角的坐标,X1,Y1,X2,Y2是开始和结束点的位置
arLEFT,TOP,RIGHT,BOTTOM,
X1,Y1,X2,Y2
arc跟上面一样,只是如果path中前面有M坐标的画不会影响圆,圆会从新开始画。上面的如果有M坐标,会有一条连线
waLEFT,TOP,RIGHT,BOTTOM,
X1,Y1,X2,Y2
clockwise arc to跟上面逆时针画弧一样,现在是顺时针。
wrLEFT,TOP,RIGHT,BOTTOM,
X1,Y1,X2,Y2
clockwise arc跟上面一样,只是如果path中前面有M坐标的画不会影响圆,圆会从新开始画。上面的如果有M坐标,会有一条连线
qxX,Yelliptical qaudrant x从当前坐标到X,Y水平方向画1/4个圆弧
qyX,Yelliptical quadrant y从当前坐标到X,Y垂直方向画1/4个圆弧
qbX,Y,X1,Y1quadratic bezier劃曲線x,y是控制点,控制当前和结束点,x1,y1是结束点(如果要重点结束可以用r 0 0 e)

我说的重点元素,是我基本上用到过的元素,但是具体情况还需要具体的分析。我更希望的是读者能自己动手一一尝试。首先两者都实现的方法肯定是比较重要的。
SVG中的M,L,C,Z 和VML中的M,L,C,X 以及名字不同功能相同的SVG的 Q 和VML的qb。
首先讲个曲线, 贝塞曲线,普及一下知识吧。
画直线有两点坐标的连线,圆有圆心半径,这些都可以用几个点定义出具体的图形,
那曲线呢?我们如果想用一系列的点能计算出任何弧度的曲线,我们需要一种算法,于是就有了贝塞曲线。
如果你用过ps,里面有一个钢笔工具就是运用的贝塞曲线。
在数学的数值分析领域中,贝塞尔曲线(Bézier曲线)是电脑图形学中相当重要的参数曲线。
贝塞尔曲线于1962年,由法国工程师皮埃尔·贝塞尔(Pierre Bézier)所广泛发表,他运用贝塞尔曲线来为汽车的主体进行设计。
一般方程为:
其中我们用到最多的就是 二次贝塞尔曲线三次贝塞尔曲线
二次贝塞尔曲线:
方程式


为建构二次贝塞尔曲线,可以中介点Q0Q1作为由0至1的t

  • P0P1的连续点Q0,描述一条线性贝塞尔曲线。
  • P1P2的连续点Q1,描述一条线性贝塞尔曲线。
  • Q0Q1的连续点Bt),描述一条二次贝塞尔曲线。
例子:
SVG:
[html]  view plain copy
  1. <!DOCTYPE html>  
  2. <html>  
  3. <head>  
  4. <title>SVG PATH</title>  
  5. </head>  
  6. <body>  
  7. <svg xmlns="http://www.w3.org/2000/svg">  
  8. <path d="M50 150Q 100 100 150 150"style="stroke:#660000; fill:none;"/>  
  9. </svg>  
  10. </body>  
  11. </html>  

VML:
[html]  view plain copy
  1. <!DOCTYPE html>  
  2. <html xmlns:v="urn:schemas-microsoft-com:vml">  
  3. <head>  
  4. <title>VML SHAPE</title>  
  5. <style>v\: * {behavior:url(#default#vml);display:inline-block}</style>  
  6. </head>  
  7. <body>  
  8. <v:shape CoordSize='1,1' path='M50 150qb 100 100 150 150 r 0 0 e' style="width:1;height:1;position:absolute" />  
  9. </body>  
  10. </html>  
三次贝塞尔曲线:
方程式



那么高次贝塞尔曲线:
以此类推,图形是这样的
例子:
SVG:
[html]  view plain copy
  1. <!DOCTYPE html>  
  2. <html>  
  3. <head>  
  4. <title>SVG PATH</title>  
  5. </head>  
  6. <body>  
  7. <svg xmlns="http://www.w3.org/2000/svg">  
  8. <path d="M50 150C50 100 250 100 250 150"style="stroke:#660000; fill:none;"/>  
  9. </svg>  
  10. </body>  
  11. </html>  

VML:
[html]  view plain copy
  1. <!DOCTYPE html>  
  2. <html xmlns:v="urn:schemas-microsoft-com:vml">  
  3. <head>  
  4. <title>SVG PATH</title>  
  5. <style>v\: * {behavior:url(#default#vml);display:inline-block}</style>  
  6. </head>  
  7. <body>  
  8. <v:shape CoordSize='2000,2000' path='M50 150C50 100 250 100 250 150T' style="width:1000px;height:1000px;position:absolute" />  
  9. </body>  
  10. </html>  

[html]  view plain copy
  1. <pre></pre>  
  2. <pre></pre>  
  3. <pre></pre>  
  4. <pre></pre>  

说了这么多我只是想让读者有个印象到底这个贝塞曲线到底如何控制的,以及关系。大概了解就行,我们不必深究。
对应到我们这里的矢量图形,也都实现了这两种方式。
二次贝塞尔曲线 :SVG Q,VML qb
三次贝塞尔曲线 : SVG C,VML C

主要的上面说的很清楚了,还有一种映射的二次贝塞尔曲线,也可以叫他们平滑的二次贝塞尔曲线,我自己这么叫的,因为画出来的曲线很流畅。
SVG中的参数为T 我觉得很好用,而且需要用到Q来结合使用,虽然vml中不兼容我们可以通过封装方法来模拟。以后做兼容类的时候这些修改会很多的。
SVG:
[html]  view plain copy
  1. <!DOCTYPE html>  
  2. <html>  
  3. <head>  
  4. <title>SVG PATH</title>  
  5. </head>  
  6. <body>  
  7. <svg xmlns="http://www.w3.org/2000/svg">  
  8. <path d="M50 150Q250 100 250 150T450 150"style="stroke:#660000; fill:none;"/>  
  9. </svg>  
  10. </body>  
  11. </html>  


我个人觉得还是很漂亮的,其他的就很简单了,看上面的表格试着写个例子,就清楚了,只有贝塞尔曲线需要一定的基础才能理解。到此基本的svg和vml的主要内容说完了。
[html]  view plain copy
  1. <pre></pre>  
  2. <pre></pre>  
  3. <pre></pre>  
  4. <pre></pre>  

原文地址: http://blog.csdn.net/a569171010/article/details/7572169

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值