最近,在写一个关于调度的仿真可视化的程序,这里简单总结一下遇到的问题。php
实例代码已发布至github上:https://github.com/jack13163/oil。前端
实例效果查看请访问:https://jack13163.github.io/oil/,后期可能会继续更新。git
首先,看一下目前仿真的效果吧。github
遇到了两个问题:app
这部分前人已经总结的很好了,详情能够移步至:js setTimeout和for循环搭配使用时变量的问题。这里简单说明一下问题,并分析一下解决方案的原理。ide
笔者最初的想法是,经过setTimeout方法在延迟指定的时间后,执行一个方法,该方法用于更新矩形的大小的位置。可谁知,一个for循环下来,只是执行了最后一次迭代的方法。主要是由于for循环很快地执行完后,变量的更改也已经执行了,延时函数尚未调用,当延时到达后,变量已经不会发生变化了。svg
上述连接中,做者的作法是将setTimeout用自定义的函数封装起来,再将变量传进来,这样一来,每次for循环,都会调用这个自定义的函数。咱们知道,当调用一个函数时,其实是将实参复制一份,产生了一个形参,这样,即使是实参修改了,形参已经将对应的变化过程当中的值所有保存了下来。于是,问题得以很巧妙地解决。函数
这里再引用一下前人的总结,更多详情请移步至:snapsvg.js中的一些使用方法。下面就看一下snap.svg.js中有哪些经常使用的方法吧。学习
Element.select(query)
采集匹配CSS选择器的内嵌元素,只返回一个。动画
如:Element.select(“#id”) 经过 id 查找元素
Element.select(query)
采集匹配CSS选择器的内嵌元素,返回多个。
如:Element.selectAll(“#id tag”) 查找 id 为 id 下的全部 tag 标签元素
Element.attr(“attribute”)
Element.attr({ opacity: value, rotate: (value * 360) });
Element.click(function(){ //do sth });
Elem.drag(onmove, onstart, onend, [mcontext],[scontext],[econtext])
正在拖动方法、拖动开始方法、拖动结束方法、正在拖动 context 、开始拖动 context 、结束拖动 context
元素分组主要用于组合不一样的元素,以便于同时移动,缩放和旋转等操做。
var r = s.rect(100,100,100,100,20,20).attr({ stroke: ‘#123456’, ‘strokeWidth’: 20, fill: ‘red’ }); var c = s.circle(50,50,50).attr({ stroke: ‘#123456’, ‘strokeWidth’: 20, fill: ‘blue’ }); var g = s.group(r,c);
var r0 = s.rect(150,150,100,100,20,20).attr({ fill: “orange”, opacity: “0.8”, stroke: “black”, strokeWidth: “2” }); var c0 = s.circle(225,225,10).attr({ fill: “silver”, stroke: “black” }); var g0 = s.group( r0,c0 ); var r1 = s.rect(100,100,100,100,20,20).attr({ fill: “red”, opacity: “0.8”, stroke: “black”, strokeWidth: “2” }); var c1 = s.circle(175,175,10).attr({ fill: “silver”, stroke: “black” }); var g1 = s.group( r1,c1 ); g1.appendTo( g0 );
详情可参见:SVG动画之Snap.animate
Element.path(pathstring);
Snap.path.isPointInside( myPathString, x,y );
M = moveto(M X,Y) :将画笔移动到指定的坐标位置 L = lineto(L X,Y) :画直线到指定的坐标位置 H = horizontal lineto(H X) :画水平线到指定的 X 坐标位置 V = vertical lineto(V Y) :画垂直线到指定的 Y 坐标位置 C = curveto(C X1,Y1,X2,Y2,ENDX,ENDY) :三次贝赛曲线 S = smooth curveto(S X2,Y2,ENDX,ENDY) Q = quadratic Belzier curve(Q X,Y,ENDX,ENDY) :二次贝赛曲线 T = smooth quadratic Belzier curveto(T ENDX,ENDY) :映射 A = elliptical Arc(A RX,RY,XROTATION,FLAG1,FLAG2,X,Y) :弧线 Z = closepath() :关闭路径
var myMatrix = new Snap.Matrix(); myMatrix.scale(4,2); // 横纵缩放 myMatrix.translate(100,0); // 平移 myMatrix.rotate(45); // 旋转
多的就不继续讲解了,高级操做有点复杂,我的也没有太懂,须要深刻研究的,这里笔者推荐若是你们想深刻学习snap.svg.js的话,能够到:https://www.zhangxinxu.com/GitHub/demo-Snap.svg/demo/basic/Element.add.php 看一下。
须要指出的是,我的以为矩阵实现动画这一部分须要有必定的前端功底。若是须要实现动画效果,笔者建议使用animate方法。最后,实例代码以下所示,还有不少待改进的地方,欢迎你们的指点和批评。