转自:http://www.d3js.cn/?p=68

svg的path标签被称为”可以组成任何形状的形状”

SVG Path可以绘制任何形状的图形,包括矩形,圆形,椭圆,折线,多边形,直线,曲线等。
W3 标准对SVG 的Path定义如下
SVG路径代表一个形状的轮廓,可以描边,填充,用作剪切路径,或任何三者的结合。
W3提供了一个形象的比喻,用钢笔和纸来表示svg的path
* 想象一个钢笔放在一张纸上。
* 钢笔在某点与纸接触。
* 笔尖移动到另一处。
* 这两个点之间的路径可以是直线或曲线。
* 曲线可以是一个弧,一立方曲线或二次贝塞尔曲线。
这意味着我们可以使用SVG路径做出任何类型的SVG形状。

SVG Path的例子

SVG Path元素的形状被一个属性所定义:d.(这也是为什么上一篇教程 通过设置d就可以绘制出一个圆环)

d这个属性,包含一系列的方法与参数.因此我们可以把这个属性称作一个“微语言”

这些方法与参数其实就是告诉电脑”如何在纸上移动你的钢笔”.

下面我们会介绍一些经典的写法,包含moveto(设置一个起点),lineto(画一条直线),curveto(画一个曲线用三次贝塞尔曲线),arc(椭圆或圆弧)和closepath(闭合路径)。

首先我们可以绘制一个三角形

 
1
2
3
4
5
6
7
    <svg width="100" height="100">
      <path d=" M 10 25
                L 10 75
                L 60 75
                L 10 25"
                stroke="red" stroke-width="2" fill="none" />
    </svg>

d属性的值” M 10 25 ……”是如下的意思:(坐标x在前y在后)

  • M 10 25 – 把笔落下,放在10,25处
  • L 10 75 – 从起点10 25出发绘制一条直线到10 75处
  • L 60 75 – 从起点10 75出发绘制一条直线到60 75处
  • L 10 25 – 从起点60 75出发绘制一条直线到10 25处

注意! (M, L)是大写的,表示绝对位置。当使用相对位置时,要小写。

SVG Path 微语言

到底如何去描述path呢,参考下面:

命令 | 参数 | 是否能重复 | 解释
M ( m ) | x, y | 不能 | 把笔尖移动到新位置,但因为没有落笔,不会“描绘图形”。所有的path都需要以m/M开头
L ( l ) | x, y | 能 | 从当前点画一条直线到坐标x,y
H ( h )| x|能 |画水平线,从当前点画一条水平线,到横坐标为X处
V ( v )| y |能|画垂线,从当前点画一条垂线,到纵坐标为Y处
C ( c ) | x1 y1 x2 y2 x y| 能 | 绘制一条曲线。起点为当前点,终点为x,y.使用(x1,y1)作为开始阶段曲线的控制点,使用 (x2,y2)作为结束阶段的控制点
S ( s ) | x2 y2 x y |能| 绘制一条平滑的曲线。 绘制一条以当前点为起点,x,y为终点绘制一条三次方贝塞尔曲线。注意这是一个简写,这条曲线同样也有两个控制点,但此时x1 y1跟x2,y2是对称的,可以直接写x2y2这一个。
Q ( q ) | x1 y1 x y |能 |二次方贝塞尔曲线。绘制一条以当前点为起点,x,y为终点的二次方贝塞尔曲线。x1 y1为控制点
T
( t ) | x y| 能
|绘制二次方贝塞尔曲线的简写。绘制一条以当前点为起点,x,y为终点的二次方贝塞尔曲线。控制点假定为前一个命令的控制点相对于当前点的反射。
如果前一个命令不存在,或者前一个命令不是二次贝塞尔曲线命令或平滑的二次贝塞尔曲线命令,则此控制点就是当前点。
A ( a ) | rx ry x-axis-rotation large-arc-flag sweep-flag x y | 能|椭圆弧线命令在当前点与指定的终点 (x, y)之间创建一条椭圆弧线。
Z ( z ) |none |不能|闭合路径。会有一条线连接路径最后一个点与起点。

关于椭圆的参数,我用拉斐尔做了个简单的demo大家可以看下就懂了 http://jsbin.com/omajal/23/edit
另外提供两张二次贝塞尔曲线与三次贝塞尔曲线的原理图

上面的这些东西大家看起来估计已经晕了。D3js就是为了解决这些恶心的东西才出现的,不过 知其然也要知其所以然,还是希望大家了解下~

D3.js Path 的例子

D3.js 包含了很多方便的方法来创建path,在浏览这些方法之前,我们先看一个简单的例子,利用d3js画线。

通常在一条折线中,包含很多的x,y点,这些点两两组合就会变成折线。

比如这样的数据

 
1
2
<code>[ { "x": 1,   "y": 5},  { "x": 20,  "y": 20}, { "x": 40,  "y": 10}, { "x": 60,  "y": 40},{ "x": 80,  "y": 5},  { "x": 100, "y": 60}];
</code>

这里我们需要一个函数,把这些xy点翻译成上面讲解的path“微语言”

 
1
2
<code>d3.svg.line()
</code>

这个path数据生成器函数可以使用我们的数据来创造一条path。在使用前,我们需要告诉d3js如何去获取数据中的x,y坐标。

因此我们创建一个函数,这个函数可以方便的去拿到数据中的x,y坐标。

 
1
2
3
4
5
<code>var lineFunction = d3.svg.line()
                          .x(function(d) { return d.x; })
                          .y(function(d) { return d.y; })
                          .interpolate("linear");
</code>

上面的函数可以把data数组中的x,y数据提取出来。之后呢,通过interpolate的设置,会使用线,连接每个点。之后就会返回一条path了。
让我们看看完整的例子

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<code>//数据
var lineData = [ { "x": 1,   "y": 5},  { "x": 20,  "y": 20},
                 { "x": 40,  "y": 10}, { "x": 60,  "y": 40},
                 { "x": 80,  "y": 5},  { "x": 100, "y": 60}];
 
//线生成器
var lineFunction = d3.svg.line()
                         .x(function(d) { return d.x; })
                         .y(function(d) { return d.y; })
                         .interpolate("linear");
 
//svg容器
var svgContainer = d3.select("body").append("svg")
                                    .attr("width", 200)
                                    .attr("height", 200);
 
//把path扔到容器中,并给d赋属性
var lineGraph = svgContainer.append("path")
                            .attr("d", lineFunction(lineData))
                            .attr("stroke", "blue")
                            .attr("stroke-width", 2)
                            .attr("fill", "none");
</code>

然后我们就拿到这么一张图:

讲解一下。.attr(“d”, lineFunction(lineData)) 是一个很关键的语句。这里我们把数据传给了lineFunction,返回了path的“微语言”,之后给d属性赋值,
这里我们直接使用了.append(“path”),因为我们只需要根据现有的数据生成一条折线。
还记得第一篇教程讲解的selectAll(), .enter(), append()组合么,那是针对多组数据来做的。而上面不需要判断有多少组数据,然后划分多少空间,放入图形啥的。

.interpolate(“linear”)这个函数告诉d3js使用直线来连接点。
D3.js提供了11种不同的线,可以让d3.svg.line() 函数来操纵.这里有非常多的专业名词,我觉得翻译还不如不翻译。。给大家看看吧。。

  • linear – piecewise linear segments, as in a polyline.
  • step-before – alternate between vertical and horizontal segments, as in a step function.
  • step-after – alternate between horizontal and vertical segments, as in a step function.
  • basis – a B-spline, with control point duplication on the ends.
  • basis-open – an open B-spline; may not intersect the start or end.
  • basis-closed – a closed B-spline, as in a loop.
  • bundle – equivalent to basis, except the tension parameter is used to straighten the spline.
  • cardinal – a Cardinal spline, with control point duplication on the ends.
  • cardinal-open – an open Cardinal spline; may not intersect the start or end, but will intersect other control points.
  • cardinal-closed – a closed Cardinal spline, as in a loop.
  • monotone – cubic interpolation that preserves monotonicity in y.

d3.svg.line()这类path生成器,既是一个函数也是一个对象,这意味着你可以把他作为方法来生成path,也可以用一些额外方法去改变它自身的属性。
并且他也是支持 链式调用的
类似d3.svg.line()这样的path生成器还有很多。比如

  • d3.svg.line – 线path生成器
  • d3.svg.line.radial – 径向path
  • d3.svg.area – 区域path
  • d3.svg.area.radial – 径向区域path
  • d3.svg.arc -圆与圆弧path
  • d3.svg.symbol – 符号path
  • d3.svg.chord -chord path,也是我们这一系列教程要用到的东西!
  • d3.svg.diagonal – diagonal path
  • d3.svg.diagonal.radial – diagonal radial path

这些生成器在d3js驱动下都拥有读取跟写入的方法, 因此可以非常方便的生成各种path。

看完了,你是否明白

 
1
2
3
4
5
6
7
<code>svg.append("g").selectAll("path")
        .data(chord.groups)
        .enter().append("path")
        .style("fill", function(d) { return fill[d.index] })
        .style("stroke", function(d) { return fill[d.index]; })
        .attr("d", d3.svg.arc().innerRadius(innerRadius).outerRadius(outerRadius))
</code>

的意思了呢?

Posted in d3.js

d3.js path路径的更多相关文章

  1. electron项目中使用js web worker时,new worker(path)路径问题

    如题,在new worker时需要传入js文件路径,可是在electron环境中使用出现问.同目录下,recorder.jsworker.js recorder.js中调用 var path = '. ...

  2. 03-Node.js学习笔记-系统模块path路径操作

    3.1为什么要进行路径拼接 不同操作系统的路径分隔符不统一 /public/uploads/avatar window 上是 \ / 都可以 Linux 上是 / 3.2路径拼接语法 path.joi ...

  3. D3.js学习(一)

    从今天开始我将和大家一起学习D3.js(Data-Driven Documents),由于国内关于D3的学习资料少之又少,所以我觉得很有必要把自己学习过程记录下来,供同学们参考,如果文章有有哪些表达有 ...

  4. 【 D3.js 高级系列 — 10.0 】 思维导图

    思维导图的节点具有层级关系和隶属关系,很像枝叶从树干伸展开来的形状.在前面讲解布局的时候,提到有五个布局是由层级布局扩展来的,其中的树状图(tree layout)和集群图(cluster layou ...

  5. 【 D3.js 高级系列 — 8.0 】 标线

    有时候,需要在地图上绘制连线,表示"从某处到某处"的意思,这种时候在地图上绘制的连线,称为"标线". 1. 标线是什么 标线,是指地图上需要两个坐标以上才能表示 ...

  6. 【 D3.js 高级系列 — 7.0 】 标注地点

    有时需要告诉用户地图上的一些目标,如果该目标是只需要一个坐标就能表示的,称其为"标注". 1. 标注是什么 标注,是指地图上只需要一个坐标即可表示的元素.例如,在经纬度(116, ...

  7. 【 D3.js 高级系列 — 6.0 】 值域和颜色

    在[入门 - 第 10 章]作了一张中国地图,其中各省份的颜色值都是随意赋值的.如果要将一些值反映在地图上,可以利用颜色的变化来表示值的变化. 1. 思路 例如,有值域的范围为: [10, 500] ...

  8. 【 D3.js 高级系列 — 2.0 】 捆图

    捆图(Bundle)是 D3 中比较奇特的一个布局,只有两个函数,而且需要与其它布局配合使用.本文讲述捆图的制作方法. 有关捆图的例子极少,很容易找到的是:http://bl.ocks.org/mbo ...

  9. 【 D3.js 高级系列 — 8.0 】 打标

    有时,需要在地图上画线.代表"从地方到什么地方"的含义,因此,在连接的映象绘制时.称为"打标". 1. 标线是什么 标线.是指地图上须要两个坐标以上才干表示的元 ...

随机推荐

  1. javascript中string对象方法中的slice、substring、substr的区别联系

    1.slice.substring.snustr均属于String的对象方法,用于截取或提取字符串片段,三者均布破坏原先的字符串,而是以新的字符串返回被提取的部分. <script> va ...

  2. python__系统 : socket_TCP补充,协程

    TCP 三次握手: SYN  -->  SYN+ACK  -->  ACK 四次挥手:  FIN --> ACK (FIN)  --> ACK TCP十种状态: LISTEN  ...

  3. yii2邮箱发送

    yii2 邮件发送  163邮箱 1.在配置文件main-local.php components=>[]里面配置 'mailer' => [ 'class' => 'yii\swi ...

  4. Head First Java-图形化界面

    Head First Java是本挺好的书,讲的比较清楚和简单.主要看原则.概念啥的.语法什么的,还是靠谷歌吧:) 这部分的笔记也有很多了,最近会努力更新和搬运.顺便自己也重新读一下. 就酱.想要这本 ...

  5. POJ 3608 凸包间最短距离(旋转卡壳)

    Bridge Across Islands Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11539   Accepted: ...

  6. 自定义注解不能拦截controller层

    1,首先在springMVC的配置文件中,webapp/WEB-INF/servlet.xml,加上AOP的相关内容: <beans xmlns="http://www.springf ...

  7. Android 文件管理器通用类 FileUtil

    1.整体分析 1.1.源代码如下,可以直接Copy. public class FileUtil { private FileUtil() { } //****系统文件目录************** ...

  8. Web性能测试问题,mysql分析之一

    在做性能测试执行中,发现性能很慢,顺藤摸瓜找一下是什么问题? 并发40个用XXX场景 1.运行过程中监控mysql数据库的CPU过高,达到65%: %CPU   %Mem  %Disk   %Net ...

  9. java练习——接口与继承

    父类与子类的构造方法: 如果父类中有一个默认无参的构造方法,那么子类的构造方法中会自动进行调用.如果父类有自己的构造方法,且这时父类没有默认无参的构造方法,那么在子类的构造方法中,必须要调用父类的某个 ...

  10. Spring---配置文件概述

    概述 Spring 的配置文件是用于指导 Spring 工厂进行Bean的生产.依赖关系注入及 Bean 实例分发的“图纸”,它是一个或多个标准的XML文档,J2EE 程序员必须学会并灵活应用这份“图 ...