2014/08/22 – SVG

一、项目功能需求:将 HTML 中 span 元素集合映射成 SVG 格式文件。

  参数: span 的绝对定位坐标和 transform 的集合,贝塞尔曲线的锚点绝对定位坐标和控制点绝对定位坐标(根据曲线路径绘制 span ),span 集合父容器的宽度和高度。

  输出: svg 的字符串形式。

二、知识点:由于涉及到 css 的 transform 样式,所以会用 Matrix 的相关理论知识。

  1. 沿着路径变化的文字: svg 中提供了 <textPath> 元素来产生文字沿着某条事先定义好的曲线路径排列的效果;

<svg>
    <defs>
        <path id="pathPreDef" d="相应路径值" />
    </defs>
    <text fill="#000">
        <textPath xlink:href="#pathPreDef">文本内容</textPath>
    </text>
</svg>

example

  2. svg 坐标系统:

  viewBox 属性用来重新定义视口的坐标范围,从而默认的坐标度量单位也会随之改变。

  <svg width="3cm" height="3cm" viewBox="0 0 300 300">...</svg>

  使默认的用户坐标系度量单位变为 0.01cm. (注:四个参数为 left top width height)

  3. 三次贝塞尔曲线的绘制:

  曲线的定义有四个点: 起始点、终止点(都称为锚点)和两个相互分离的中间点(都称为控制点)。

  svg 中绘制命令(数据)为: "C x1 y1 x2 y2 destx desty" (x1 y1 为控制点1, x2 y2 为控制点2, destx desty 为终点, C 为普通绘制)

  除了普通绘制,还有 S 的光滑绘制,区别在于少一个控制点,即 S 只有一个控制点。

  4. svg 中的相关 transform 矩阵格式

  rotate: [cos(a) sina(a) -sin(a) cos(a) 0 0]  (a 为旋转的 rad, deg = rad / π * 180)

  swekedX: [1 0 tan(a) 1 0 0]

  swekedY: [1 tan(a) 0 1 0 0]

  scale: [sx 0 0 sy 0 0]  (sx 为依 x 轴缩放比例, sy 为依 y 轴缩放比例)

   = [a b c d e f]

  (详见 W3C SVG 标准文档

  5. 二维坐标系的矩阵变换公式

  

  (参见 SVG 元素转换后的坐标,即求逆矩阵

三、相关代码及所用类库:

  1. 矩阵乘:(后来找到了一个类库被取代了)

function _matrixMultiply(arr1, arr2) {
            var returnArr = [],
                lenCol = arr1[0].length > arr2[0].length ? arr1[0].length : arr2[0].length,
                lenRow = arr1.length > arr2.length ? arr1.length : arr2.length,
                i, j, arr1Item, arr2Item, sum;
            for (i = 0; i < lenRow; i++) {//row
                sum = 0;
                returnArr[i] = [];
                for (j = 0; j < lenCol; j++) {//col
                    returnArr[i][j] = _pointSum(i, j, arr1, arr2);
                }
            }
            return returnArr;
        }

        function _pointSum(i, j, arr1, arr2, undefined) {
            var sum = 0, index = 0, isArr1Spill = false, isArr2Spill = false;
            while (!isArr1Spill || !isArr2Spill) {
                isArr1Spill = arr1[i] === undefined || arr1[i][index] === undefined;
                isArr2Spill = arr2[index] === undefined || arr2[index][j] === undefined;
                sum += (isArr1Spill ? 0 : arr1[i][index]) * (isArr2Spill ? 0 : arr2[index][j]);
                index++;
            }
            return sum;
        }

  2. Matrix 类库:sylvester

  Matrix.create([[],[],[]]) 返回 Matrix 对象;    .elements 属性包含矩阵值    .multiply(MatrixObject) 方法求乘机    .inverse() 方法获取逆矩阵end 

2014/08/22 – SVG

时间: 2024-11-08 21:22:16

2014/08/22 – SVG的相关文章

2014/08/05 – Backbonejs

[来自: Backbone.js 开发秘笈 第2章] Model API: (function ($) { //define Model Class ------------------- var ModelClass = Backbone.Model.extend({ defaults: {},//Backbone 支持在模型初始化时动态进行定义 [支持多行表达式设置默认值,即值为函数] initialize: function () { //模型对象被创建后即被调用 /* 注:如定义了默认属

Bootstrap 3.2.0 源码试读 2014/08/07

第一部分 normalize.css 70至72行 small {   font-size: 80%; } 设置small标签的字体大小为父容器字体的80%. 73至79行 sub, sup {   position: relative;   font-size: 75%;   line-height: 0;   vertical-align: baseline; } sup {   top: -.5em; } sub {   bottom: -.25em; } 先设置上标sup及下标sub,位

2014/08/08 – Backbonejs

[来自: Backbone.js 开发秘笈 第5章] Event API: (function ($) { //define ------------------------- var obj = {}; var obj2 = { commonEvent: function () { window.document.title = new Date().toString(); } }; //扩展对象包含事件 _.extend(obj, Backbone.Events); _.extend(obj

2014/08/06 – Backbonejs

[来自:Backbone.js 开发秘笈 第3章] Collection API (function ($) { //define ----------------------------- var ModelD = Backbone.Model.extend({ defaults: { ID: 0, Name: '' }, idAttribute: 'ID' }); //定义集合对象 /* 在其内部,模型被存储在一个名为 models 的数组当中 */ var CollectionD = Ba

Bootstrap 3.2.0 源码试读 2014/08/09

第一部分 normalize.css 104至110行 code,    /* 编辑代码 */ kbd,    /* 键盘输入的文本 */ pre, samp {    /* 范例,sample的简写 */   font-family: monospace, monospace;    /* 这个地方应该是写错了,第二字体应该是serif */   font-size: 1em; } 设置字体的大小为1em,字体为monospace. 111至119行 button, input, optgro

在MyEclipse配置自己安装的Tomcat(2014.08.18)

今天因为要在tomcat下运行一个java项目,第一次嘛,遇到了不少问题,总结分享一下: 第一次,我直接将 MyEclipse 生成的项目放到 tomcat 安装目录的 webapps 目录下,运行出现404,无法访问. 然后想了想,发现这是个错误的做法.应该先通过 MyEclipse 将项目部署到 Tomcat 下: 然后, MyEclipse 自带了 tomcat,我要配置自己安装的 TomCat : (请看参考资料:http://jingyan.baidu.com/article/4853

X100S Collection Before 2014/08/01

风暴前的东京湾 // Tokyo Bay before Storm 上野公园 // Ueno Park X100S Collection Before 2014/08/01,布布扣,bubuko.com

【2014.6.22】

这几天一直在看世界杯,看到很多同学压钱,就跟着压了,(当然是看到可以天上掉馅饼才……). 这几天的钱就像流水似的往外流(虽然没那么夸张). 不过让我再次体会到了 永远期待美好的事情发生,但不要期望天上掉馅饼,no pains,no  gains. [2014.6.22],布布扣,bubuko.com

2014/08/04 – Backbonejs

[来自: Backbone.js 开发秘笈 第1章] 各种模型实际上是通过扩展其基类 Backbone.Model 实现的.同理,定义的集合是靠扩展其基类 Backbone.Collection 而实现的. 控制器的功能被分散实现在 Backbone.Router 和 Backbone.View 当中. 路由器负责处理 URL 的变化,并且委派一个视图来继续处理应用.路由器(异步)获取模型后,随即触发一个视图的更新操作. 视图负责监听 DOM 事件.它要么对模型进行更新,要么通过路由器转移到应用