﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-TWaver - 专注UI技术</title><link>http://www.blogjava.net/TWaver/</link><description>http://twaver.servasoft.com/</description><language>zh-cn</language><lastBuildDate>Sun, 10 May 2026 07:57:10 GMT</lastBuildDate><pubDate>Sun, 10 May 2026 07:57:10 GMT</pubDate><ttl>60</ttl><item><title>VR技术在数据中心3D机房中的应用 （下）</title><link>http://www.blogjava.net/TWaver/archive/2017/06/01/432566.html</link><dc:creator>TWaver</dc:creator><author>TWaver</author><pubDate>Thu, 01 Jun 2017 06:08:00 GMT</pubDate><guid>http://www.blogjava.net/TWaver/archive/2017/06/01/432566.html</guid><wfw:comment>http://www.blogjava.net/TWaver/comments/432566.html</wfw:comment><comments>http://www.blogjava.net/TWaver/archive/2017/06/01/432566.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TWaver/comments/commentRss/432566.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TWaver/services/trackbacks/432566.html</trackback:ping><description><![CDATA[<span style="font-size:10.5pt;font-family:等线;Times New Roman&quot;;">VR</span><span style="font-size:10.5pt;font-family:等线;Times New Roman&quot;;">技术在数据中心3D机房中的应用 （下）<br /></span><br /><p>前面给大家简单科普了一下VR的硬件设备以及VR在各个领域的应用，是不是觉得非常高大上？千言万语概括成一句话，VR能给用户带来前所未有的<span style="font-family:宋体;color:#393939;">沉浸感和交互方式，让人足不出户就能够接触到外面的世界。世界那么大，我想去看看，可是我又懒，那该怎么办？于是，</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">就这么火了。</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;color:#393939;">相信很多人都跟我的朋友</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">A</span><span style="font-family:宋体;color:#393939;">一样，觉得</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">是高科技，太先进，太高不可攀了。然而事实并不是这样。随着技术的普及，</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">已经逐渐渗透到我们生活的方方面面。（没有做不到，只有你想不到）</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;color:#393939;">有人说，</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">2016</span><span style="font-family:宋体;color:#393939;">年是</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">内容元年，而</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">2017</span><span style="font-family:宋体;color:#393939;">年，可能会是</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">垂直应用的元年。在我看来，是不是元年还不确定，可以肯定的是，各个行业都需要有经验的人参与进来一起探索，才可能造就</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">应用的落地生根。</span></p>  <p>&nbsp;</p>  <p>作为一个长期在数据中心行业里浸染的人士，并且已经在三维可视化领域耕耘数载的老司机，凭着个人的嗅觉，我是非常看好数据中心的VR应用。理由有几个：</p>  <p>&nbsp;</p>  <p>首先，数据中心的三维可视化技术已经成熟，大量的内容已经被生产出来，只差打通VR应用。</p>  <p>第二，数据中心本身的运营和管理的确需要高沉浸感的体验方式。数据中心本身就不是一个可以随意进入的区域，而且，数据中心的规模日益扩大，早已无法依靠人力去巡视和管理。</p>  <p>&nbsp;</p>  <p>第三，数据中心市场前景非常开阔，基础设施、软件开发、运维管理各个层面的从业者都有这个能力来引入VR这样的应用。</p>  <p>&nbsp;</p>  <p>第四，数据中心本身就处于前沿技术领域，天生拥抱新鲜技术，不存在传统行业经常遇到的阻力。</p>  <p>&nbsp;</p>  <p><span style="font-size:11.5pt;color:#3D464D; background:white">想要用户为</span><span style="font-size:11.5pt; font-family:&quot;Helvetica&quot;,sans-serif;color:#3D464D;background:white">VR</span><span style="font-size:11.5pt;color:#3D464D;background:white">买单，一定是因为它实实在在的解决了问题。下面我们就来看看</span><span style="font-size:11.5pt;font-family:&quot;Helvetica&quot;,sans-serif; color:#3D464D;background:white">VR</span><span style="font-size:11.5pt;color:#3D464D;background:white">是如何与数据中心机房应用结合起来的。</span></p>  <p>&nbsp;</p>  <p>，我们拿TWaver的3D机房当小白鼠，戴上头盔，你就会感觉到自己身处于园区当中，以行走在园区中的视角去查看并了解整个企业的资产。</p>  <p> </p>  <p>&nbsp;<img src="http://www.blogjava.net/images/blogjava_net/twaver/image17.jpg" border="0" alt="" /><br /></p>  <p>转动头部可以轻松控制视角与方向，便于看到各个角落。</p>  <p> </p>  <p>&nbsp;<img src="http://www.blogjava.net/images/blogjava_net/twaver/image18.jpg" border="0" alt="" /></p>  <p>手柄就是你在虚拟园区中拥有的虚拟双臂。利用手柄，可以选择需要进入的园区，楼层和房间，还可以打开机柜，查看设备，板卡，进行设备上下架的操作等。虽说在PC屏幕上操作三维可视化系统已经是非常清晰直观了，但是采用VR技术，能让用户有身临其境的感觉，仿佛亲自在机房过道里行走巡视，对机房进行管理。</p>  <p> </p>  <p>&nbsp;<img src="http://www.blogjava.net/images/blogjava_net/twaver/image19.jpg" border="0" alt="" /></p>  <p>&nbsp;</p>  <p>除此之外，VR技术还能协助机房设计。设计师带上头盔，能够利用站在机房里的视角对机柜，机架，走线进行布置，更加合理高效。</p>  <p> </p>  <p><img src="http://www.blogjava.net/images/blogjava_net/twaver/image20.jpg" border="0" alt="" /><br /></p>  <p>VR效果的3D机房是不是很酷炫呢？要实现这样的效果在程序上操上其实并不难。<br /><img src="http://www.blogjava.net/images/blogjava_net/twaver/image21.png" border="0" alt="" /><br /></p>  <p align="left"><span style="font-family:宋体;color:#393939;">大家都知道</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">TWaver</span><span style="font-family:宋体;color:#393939;">数据中心可视化软件是基于</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">WebGL</span><span style="font-family:宋体;color:#393939;">的，用浏览器就能跑起来。同样，用浏览器也能进入</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">的世界。用浏览器就能体验</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">就要感谢</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">WebVR</span><span style="font-family:宋体;color:#393939;">了，目前谷歌的</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">Chrome VR</span><span style="font-family:宋体;color:#393939;">版和火狐的</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">Nightly</span><span style="font-family:宋体;color:#393939;">版都支持</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">WebVR</span><span style="font-family:宋体;color:#393939;">，这些浏览器也支持</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">HTC Vive</span><span style="font-family:宋体;color:#393939;">和</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">Oculus Rift</span><span style="font-family:宋体;color:#393939;">。</span></p>  <p align="left">&nbsp;</p>  <p align="left"><span style="font-family:宋体;color:#393939;">目前只有</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">WebGL</span><span style="font-family:宋体;color:#393939;">的内容才能呈现到</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">WebVR</span><span style="font-family:宋体;color:#393939;">中，将来可能普通</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">HTML</span><span style="font-family:宋体;color:#393939;">元素也能在</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">WebVR</span><span style="font-family:宋体;color:#393939;">中呈现，下面我们来看看如何使用</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">WebVR</span><span style="font-family:宋体;color:#393939;">：</span></p>  <p align="left"> </p>  <p align="left"><span style="font-family:宋体;color:#393939;">嗯，相信你也看到了，其实也没有什么神秘的：就是把</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">canvas</span><span style="font-family:宋体;color:#393939;">的大小设置成</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">眼镜的大小（否则眼镜里看到了图像会非常模糊，原因是虽然</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">眼镜离人眼非常近，即使</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">眼镜的屏幕很小，但分辨率比普通</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">PC</span><span style="font-family:宋体;color:#393939;">高多了）；然后把</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">3D</span><span style="font-family:宋体;color:#393939;">场景绘制了两遍（分左眼和右眼）。</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">WebVR</span><span style="font-family:宋体;color:#393939;">对硬件的性能要求更高了，除了绘制两遍外，刷新屏幕为</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">90</span><span style="font-family:宋体;color:#393939;">赫兹，需要保证</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">13ms</span><span style="font-family:宋体;color:#393939;">内绘制完成，否则很容易让用户感到头晕。</span></p>  <p align="left">&nbsp;</p>  <p align="left"><span style="font-family:宋体;color:#393939;">如果你手头上正好有</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">HTC Vive</span><span style="font-family:宋体;color:#393939;">或者</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">Oculus Rift</span><span style="font-family:宋体;color:#393939;">，赶紧来试试</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">版的</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">TWaver</span><span style="font-family:宋体;color:#393939;">数据中心可视化软件吧。或者戳下方视频，看看真实版用户体验</span><span style="font-size:10.0pt;font-family:&quot;Arial&quot;,sans-serif;color:#333333; background:white">&#8595;<br /><br /><a href="http://player.youku.com/player.php/sid/XMjc5NzM0MzI3Ng==/v.swf" title="VR技术支持的数据中心可视化">VR技术支持的数据中心可视化<br /></a><br /></span></p>  <p>VR支持的数据中心可视化就先说到这儿了，要是有对VR有兴趣想进一步了解的，或者对其它技术问题想要聊一聊的，欢迎留言：)</p>  <p>&nbsp;</p><img src ="http://www.blogjava.net/TWaver/aggbug/432566.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TWaver/" target="_blank">TWaver</a> 2017-06-01 14:08 <a href="http://www.blogjava.net/TWaver/archive/2017/06/01/432566.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VR技术在数据中心3D机房中的应用（上）	</title><link>http://www.blogjava.net/TWaver/archive/2017/05/31/432564.html</link><dc:creator>TWaver</dc:creator><author>TWaver</author><pubDate>Wed, 31 May 2017 08:45:00 GMT</pubDate><guid>http://www.blogjava.net/TWaver/archive/2017/05/31/432564.html</guid><wfw:comment>http://www.blogjava.net/TWaver/comments/432564.html</wfw:comment><comments>http://www.blogjava.net/TWaver/archive/2017/05/31/432564.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TWaver/comments/commentRss/432564.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TWaver/services/trackbacks/432564.html</trackback:ping><description><![CDATA[<p><strong><a name="_Hlk483664804"></a><span style="font-size: 18pt;">VR技术在数据中心3D机房中的应用（上）&nbsp;&nbsp; </span></strong></p>  <p>&nbsp;<br /><br /></p>  <p align="left"><span style="font-family:宋体;color:#393939;">前两天跟朋友</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">A</span><span style="font-family:宋体;color:#393939;">吃饭，吃着吃着就说到了</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">。近几年来，</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">技术越来越火，感觉能跟</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">沾点边的都特别高大上，朋友</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">A</span><span style="font-family:宋体;color:#393939;">也是，一提到</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">，就怎么都掩盖不住他发自肺腑的敬仰之情。好吧，作为一个技术宅，我觉得是时候说点跟</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">相关的事儿了。</span></p>  <p align="left">&nbsp;</p>  <p align="left"><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">，也就是</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;"> virtual reality</span><span style="font-family:宋体;color:#393939;">的缩写，全称是虚拟现实。从字面上理解，就是这种技术能把现实中的一切实物用模型建造出来，再通过一些硬件设备的对接，把你的身体放在这个虚拟场景当中，甚至是用一些不属于人类本身的视角去看这个世界。<br /><br /></span></p>  <p align="left"><span style="font-family:宋体;color:#393939;">举个栗子。</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">Google earth</span><span style="font-family:宋体;color:#393939;">已经在去年为自己的产品提供了全方位的</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">技术支持。</span></p>  <p align="left"><span style="font-family:宋体;color:#393939;">地球的图片大家都见过吧？可是身处浩瀚宇宙中去看这颗我们赖以生存的星球，这样的体验你你有过吗？<br /><img src="http://www.blogjava.net/images/blogjava_net/twaver/2222.jpg" border="0" alt="" /><br /><br /></span></p>  <p align="left"> </p>  <p align="left"><span style="font-family:宋体;color:#393939;">再比如，相信大家都爬过山，我也是登山爱好者。每次爬山都觉得山顶高不可及，累到气喘吁吁也只有仰望的份。但是让自己像雄鹰一样掠过一座座山顶，俯瞰山川，这样的视觉效应是不是也让人心痒痒呢？<br /><img src="http://www.blogjava.net/images/blogjava_net/twaver/image2.jpg" border="0" alt="" /><br /></span></p>  <p align="left"> </p>  <p align="left"><span style="font-family:宋体;color:#393939;">所以简单地说，</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">就是这样一种技术，能让你有一些超越人类视角本身的体验。</span></p>  <p align="left"><br /></p>  <p align="left"><span style="font-family:宋体;color:#393939;">说完</span><span style=" font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VR</span><span style=" font-family:宋体;color:#393939;">是什么，再来谈一下</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">怎么实现吧。用最简单粗暴的方式来说，无非就是一：硬件；二：内容（技术支持）。</span></p>  <p align="left">&nbsp;</p>  <p align="left"><span style="font-family:宋体;color:#393939;">现在市面上有很多</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">硬件，大致可以分为三类：</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">眼镜、</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">一体机、</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">头盔。</span></p>  <p align="left">&nbsp;</p>  <p align="left"><strong><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">眼镜</span></strong></p>  <p align="left"><span style="font-family:宋体;color:#393939;">如果你预算有限，只是想体验一下</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">，看看电影，玩玩小游戏，可以考虑</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">眼镜。</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">眼镜又细分为</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">2</span><span style="font-family:宋体;color:#393939;">类：入门级和进阶版。</span></p>  <p align="left">&nbsp;</p>  <p align="left"><span style="font-family:宋体;color:#393939;">入门级的</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">眼镜就是个盒子，里面有</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">2</span><span style="font-family:宋体;color:#393939;">个镜片，放一个手机进去，代表作有谷歌的</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">Cardboard</span><span style="font-family:宋体;color:#393939;">、小米</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">玩具版等，需要手动调焦，延迟和眩晕感都很严重。</span></p>  <p align="left"> </p>  <p align="left"><img src="http://www.blogjava.net/images/blogjava_net/twaver/image3.jpg" border="0" alt="" width="800" height="573" /><br /><br /></p>  <p align="left"><span style="font-family:宋体;color:#393939;">进阶版的</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">眼镜有运动传感器，对手机硬件做了优化，延迟和眩晕感比入门级的低。一般会配备一个控制器，类似鼠标，有了控制器就不需要用脑袋交互了，用控制器就可以交互。代表作有三星的</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">Gear VR</span><span style="font-family:宋体;color:#393939;">、谷歌的</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">Daydream View</span><span style="font-family:宋体;color:#393939;">、小米</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">眼镜等。这类</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">眼镜一般只支持自家的手机。如果手上正好有这样的手机，可以买个对应的</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VR</span><span style="font-family: 宋体; color: #393939;">眼镜尝尝鲜。<br /><img src="http://www.blogjava.net/images/blogjava_net/twaver/image4.png" border="0" alt="" width="800" height="566" /><br /><br /></span></p>  <p align="left"> </p>  <p align="left"><span style="font-family: 宋体; color: #393939;">一类</span><span style="font-family: Helvetica, sans-serif; color: #393939;">VR</span><span style="font-family: 宋体; color: #393939;">眼镜号称兼容各种型号的手机，</span><span style="font-family: Helvetica, sans-serif; color: #393939;">VR</span><span style="font-family: 宋体; color: #393939;">沉浸感比进阶版的差一些，原因是没有针对具体手机优化，代表作有</span><span style="font-family: 宋体; color: #252525; background: white;">暴风</span><span style="font-family: 宋体; color: #393939;">、大朋等。价格比入门级的几十块的贵，比进阶版的便宜。</span></p>  <p align="left"><br /></p>  <p align="left"><strong><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">一体机</span></strong></p>  <p align="left"><span style="font-family:宋体;color:#393939;">简单讲就是</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">眼镜内置了手机，代表作有暴风魔镜一体机</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">Matrix</span><span style="font-family:宋体;color:#393939;">、大朋</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">一体机</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">M2</span><span style="font-family:宋体;color:#393939;">等。现阶段不建议购买</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">一体机。不过这次谷歌在这次</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">IO</span><span style="font-family:宋体;color:#393939;">大会上发布的，跟</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">HTC</span><span style="font-family:宋体;color:#393939;">和联想合作的</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">Daydream Standalone VR</span><span style="font-family:宋体;color:#393939;">值得期待，据说使用了谷歌最新的</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">WorldSense</span><span style="font-family: 宋体; color: #393939;">技术，可以不需要外部定位设备，就能追踪头部的位置，而不仅仅是头部的旋转</span>&nbsp;</p>  <p align="left"><strong><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">头盔</span></strong></p>  <p align="left"><span style="font-family:宋体;color:#393939;">需要用</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">HDMI</span><span style="font-family:宋体;color:#393939;">视频线连接高性能</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">PC</span><span style="font-family:宋体;color:#393939;">主机，也就是靠</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">PC</span><span style="font-family:宋体;color:#393939;">主机的显卡输出视频信号到</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">头盔里。另外这类设备一般配备定位装置，能感知头盔、手柄的位置、方向、加速度等。如果你是游戏发烧友，强烈推荐</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">头盔。代表作有早期的</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">HTC Vive</span><span style="font-family:宋体;color:#393939;">、</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">Oculus Rift</span><span style="font-family:宋体;color:#393939;">、索尼</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">PlayStation VR</span><span style="font-family:宋体;color:#393939;">，以及国内的后来者大朋</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">头盔</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">E3</span><span style="font-family:宋体;color:#393939;">、蚁视二代头盔、小派</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">4K</span><span style="font-family:宋体;color:#393939;">、</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">hypereal</span><span style="font-family:宋体;color:#393939;">的</span><span style=" font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">Pano</span><span style=" font-family:宋体;color:#393939;">等。<br /><img src="http://www.blogjava.net/images/blogjava_net/twaver/image6.jpg" border="0" alt="" /><br /></span></p>  <p align="left">&nbsp;</p>  <p align="left"> </p>  <p align="left">&nbsp;</p>  <p align="left"><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">头盔的优势很明显：延迟小，有定位装置，但美中不足的是必须拖一根视频线，在</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">世界中漫游时总是会不小心被这根线缠住，而且</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">头盔普遍比较重。不过去年双</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">11</span><span style="font-family:宋体;color:#393939;">期间</span><span style=" font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">HTC</span><span style=" font-family:宋体;color:#393939;">推出的</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">TPCAST VIVE</span><span style="font-family:宋体;color:#393939;">无线升级套件让</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">头盔摆脱了这根线的束缚，不过也有报道说</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">2</span><span style="font-family:宋体;color:#393939;">套</span><span style=" font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">TPCST</span><span style=" font-family:宋体;color:#393939;">之间有干扰，而且待机时间也是个问题。</span></p>  <p align="left"> </p>  <p align="left"><img src="http://www.blogjava.net/images/blogjava_net/twaver/image7.png" border="0" alt="" /><br /><br /></p>  <p align="left"><span style="font-family:宋体;color:#393939;">由于</span><span style=" font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VR</span><span style=" font-family:宋体;color:#393939;">眼镜、</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">一体机都是借助于手机呈现</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">3D</span><span style="font-family:宋体;color:#393939;">内容，性能都没法满足数据中心可视化的要求，而且没有很好的定位方案，为了最好的视觉和交互体验，我们采用了由</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">HTC</span><span style="font-family:宋体;color:#393939;">和</span><span style=" font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">Valve</span><span style=" font-family:宋体;color:#393939;">共同研发的</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VIVE</span><span style="font-family:宋体;color:#393939;">。</span></p>  <p align="left">&nbsp;</p>  <p align="left"><span style="font-family:宋体;color:#393939;">谈完</span><span style=" font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VR</span><span style=" font-family:宋体;color:#393939;">硬件，再来谈谈</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">内容。面向消费者的</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">内容可以分为：游戏、全景视频、全景直播、全景图片等；面向企业的</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">内容就很多了，在教育、军事、医疗、旅游、房地产、健身、室内装修、商品展示等领域都有应用。</span></p>  <p align="left">&nbsp;</p>  <p align="left"><span style="font-family:宋体;color:#393939;">另外</span><span style=" font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VR</span><span style=" font-family:宋体;color:#393939;">内容的制作分两类：全景拍摄和</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">3D</span><span style="font-family:宋体;color:#393939;">建模。全景拍摄可以生产出全景视频、全景直播、全景图片等，全景图片可以加工成</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">应用，用户只能在几个固定的点中移动，不能在</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">3D</span><span style="font-family:宋体;color:#393939;">场景中随意行走。游戏、</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">TWaver</span><span style="font-family:宋体;color:#393939;">数据中心可视化软件等，都需要</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">3D</span><span style="font-family:宋体;color:#393939;">建模。前面栗子中提到的</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">Google Earth VR</span><span style="font-family:宋体;color:#393939;">结合了全景拍摄和</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">3D</span><span style="font-family:宋体;color:#393939;">建模，属于黑科技产品，可以戳链接亲身体验一下。</span></p>  <p align="left">&nbsp;</p>  <p align="left"><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;"><em><strong>&nbsp;Google Earth VR</strong></em></span></p>  <p align="left"><a href="https://vr.google.com/earth/"><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:blue;">https://vr.google.com/earth/</span></a></p>  <p align="left"><span style="font-family:宋体;color:#393939;">支持</span><span style=" font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">HTC Vive</span><span style=" font-family:宋体;color:#393939;">和</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">Oculus Rift</span></p>  <p align="left"><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">Steam</span><span style="font-family:宋体;color:#393939;">下载地址：</span></p>  <p align="left"><a href="http://store.steampowered.com/app/348250/"><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:blue;">http://store.steampowered.com/app/348250/</span></a></p>  <p align="left"><span style="font-family:宋体;color:#393939;">如果你碰到如下提示：</span></p>  <p align="left"><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">This item is currently unavailable in your region</span></p>  <p align="left"><span style="font-family:宋体;color:#393939;">可以在</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">IE</span><span style="font-family:宋体;color:#393939;">或者</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">Edge</span><span style="font-family:宋体;color:#393939;">中输入如下地址即可安装</span></p>  <p align="left"><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">steam://install/348250</span></p>  <p align="left"><span style="font-family:宋体;color:#393939;">如果你在启动</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">Google Earth VR</span><span style="font-family:宋体;color:#393939;">时碰到如下提示：</span></p>  <p align="left"><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">loading labels failed due to an unknown error</span></p>  <p align="left"><span style="font-family:宋体;color:#393939;">说明你和</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">google</span><span style="font-family:宋体;color:#393939;">服务器之间有障碍，请科学上网</span></p>  <p align="left"><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">Google Earth VR</span><span style="font-family:宋体;color:#393939;">是谷歌</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">10</span><span style="font-family:宋体;color:#393939;">几年前发布的</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">Google Earth</span><span style="font-family:宋体;color:#393939;">的</span><span style=" font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VR</span><span style=" font-family:宋体;color:#393939;">版，让你足不出户就能领略世界各地的自然风光。<br /><img src="http://www.blogjava.net/images/blogjava_net/twaver/image8.jpg" border="0" alt="" /><br /><br /></span></p>  <p align="left"> </p>  <p align="left"><span style="font-family:宋体;color:#393939;">交互上最大的亮点是在城市中穿梭时，只有中心画面在动，边缘画面被虚化，出现了不动的网格，谷歌管这个</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">tunnel vision</span><span style="font-family:宋体;color:#393939;">。这样你就会感觉自己站在原定不动，只是眼前的画面在动，就像看电影似的，好处是既不会像真正的飞行那样让人产生眩晕感，也不像</span><span style="font-size:11.5pt;font-family:&quot;微软雅黑&quot;,sans-serif;color:#262626;background:white;">teleport</span><span style="font-family:宋体;color:#393939;">那样得不到连续的场景变化效果。<br /><img src="http://www.blogjava.net/images/blogjava_net/twaver/image9.jpg" border="0" alt="" /><br /><br /></span></p>  <p align="left"> </p>  <p align="left"><span style="font-family:宋体;color:#393939;">可惜的是国内是一马平川<br /><img src="http://www.blogjava.net/images/blogjava_net/twaver/image10.jpg" border="0" alt="" /><br /></span></p>  <p align="left"> </p>  <p align="left">&nbsp;</p>  <p align="left"><span style="font-family:宋体;color:#393939;">除了</span><span style=" font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">Google earth VR</span><span style="font-family:宋体;color:#393939;">之外，还有一些我个人觉得还不错的产品，比如：</span></p>  <p align="left"><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;"><strong><em>&nbsp;The Lab</em></strong></span></p>  <p align="left"><span style="font-family:宋体;color:#393939;">支持</span><span style=" font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">HTC Vive</span><span style=" font-family:宋体;color:#393939;">和</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">Oculus Rift</span></p>  <p align="left"><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">Steam</span><span style="font-family:宋体;color:#393939;">下载地址：</span></p>  <p align="left"><a href="http://store.steampowered.com/app/450390/The_Lab/"><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:blue;">http://store.steampowered.com/app/450390/The_Lab/</span></a></p>  <p align="left"><span style="font-family:宋体;color:#393939;">这款游戏包含了</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">8</span><span style="font-family:宋体;color:#393939;">个小游戏，是</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">Valve</span><span style="font-family:宋体;color:#393939;">在</span><span style=" font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VR</span><span style=" font-family:宋体;color:#393939;">游戏领域的试水作品。进入</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">世界后，以往</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">PC</span><span style="font-family:宋体;color:#393939;">的交互方式都过时了，</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">Valve</span><span style="font-family:宋体;color:#393939;">的工作人员尝试了各种交互方式，让</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">游戏体验更真实。更多关于这款游戏的开发历程，可以移步这里：</span></p>  <p align="left"><a href="https://www.youtube.com/watch?v=rtotczP5DrI"><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:blue;">https://www.youtube.com/watch?v=rtotczP5DrI</span></a></p>  <p align="left" style="margin-left: 21pt; text-indent: -21pt;"><br /></p>  <p align="left"><span style="font-family: 宋体; color: #393939;">比较搞笑的问题是（我也试过，哈哈）：<br /><img src="http://www.blogjava.net/images/blogjava_net/twaver/image11.png" border="0" alt="" /><br /><img src="http://www.blogjava.net/images/blogjava_net/twaver/image12.jpg" border="0" alt="" /><br /><img src="http://www.blogjava.net/images/blogjava_net/twaver/image13.jpg" border="0" alt="" /><br /></span></p>  <p align="left"> </p>  <p align="left">&nbsp;</p>  <p align="left"><span style="font-family:宋体;color:#393939;">还有这个也可以尝试着玩一把：</span></p>  <p align="left"><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">&nbsp;<strong><em>SteamVR Home</em></strong></span></p>  <p align="left"><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">SteamVR Home</span><span style="font-family:宋体;color:#393939;">是</span><span style=" font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">Steam</span><span style=" font-family:宋体;color:#393939;">平台推出的</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">SteamVR</span><span style="font-family:宋体;color:#393939;">应用启动平台，玩家可以定制自己的私人空间，和其他玩家交互，打开了</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">VR</span><span style="font-family:宋体;color:#393939;">社交应用的新篇章。</span></p>  <p align="left"><span style="font-family:宋体;color:#393939;">安装方法：打开</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">Steam</span><span style="font-family:宋体;color:#393939;">，在</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">Library</span><span style="font-family:宋体;color:#393939;">中的</span><span style=" font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">Tools</span><span style=" font-family:宋体;color:#393939;">中找到</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">Steam VR</span><span style="font-family:宋体;color:#393939;">，右键选择</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">Properties</span><span style="font-family:宋体;color:#393939;">，在</span><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:#393939;">Betas</span><span style="font-family:宋体;color:#393939;">页签中选择</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">SteamVR Beta</span></p>  <p align="left"><span style="font-family:宋体;color:#393939;">更多关于</span><span style="font-family:&quot;Helvetica&quot;,sans-serif; color:#393939;">SteamVR Home</span><span style="font-family:宋体;color:#393939;">的介绍可以参考这里：</span></p>  <p align="left"><span style="font-family:&quot;Helvetica&quot;,sans-serif;color:blue;"><a href="https://steamcommunity.com/games/250820/announcements/detail/1256913672017157095">https://steamcommunity.com/games/250820/announcements/detail/1256913672017157095<br /><br /></a></span></p><p align="left"><span style="font-family:宋体;color:#393939;">按着手柄的方向按钮可以在房间内跳跃：<br /></span><img src="http://www.blogjava.net/images/blogjava_net/twaver/image15.jpg" border="0" alt="" /><span style="font-family: 宋体; color: #393939;"><br />进入特定的区域（有字母</span><span style="font-family: Helvetica, sans-serif; color: #393939;">i</span><span style="font-family: 宋体; color: #393939;">的地方）后，比如门前和花园前，会出来菜单，可以自定义场景：<br /><img src="http://www.blogjava.net/images/blogjava_net/twaver/image16.jpg" border="0" alt="" /><br /></span></p>  <p align="left"> </p>    <p align="left"><span style="font-family: 宋体;"><br />今天就先说到这儿吧，明儿下班再给大家侃点更酷炫的：）<br /><br /><br /></span></p><img src ="http://www.blogjava.net/TWaver/aggbug/432564.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TWaver/" target="_blank">TWaver</a> 2017-05-31 16:45 <a href="http://www.blogjava.net/TWaver/archive/2017/05/31/432564.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HTML5数据可视化第四弹：可交互地铁线路图</title><link>http://www.blogjava.net/TWaver/archive/2016/12/13/432072.html</link><dc:creator>TWaver</dc:creator><author>TWaver</author><pubDate>Tue, 13 Dec 2016 06:36:00 GMT</pubDate><guid>http://www.blogjava.net/TWaver/archive/2016/12/13/432072.html</guid><wfw:comment>http://www.blogjava.net/TWaver/comments/432072.html</wfw:comment><comments>http://www.blogjava.net/TWaver/archive/2016/12/13/432072.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TWaver/comments/commentRss/432072.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TWaver/services/trackbacks/432072.html</trackback:ping><description><![CDATA[<div><p><span id="wmd-input-section-3"><span h1"=""><span md-hash"="" md=""><strong>前言</strong></span></span></span></p><p>&nbsp;</p><p><span id="wmd-input-section-3"><span h1"=""><span md-hash"="" md=""><span lf"=""><span p"="">最近特别忙，承蒙大伙关照，3D机房的项目一个接着一个，领了一帮小弟，搞搞传帮带&#8230;&#8230;有个小弟很不错，勤奋好学，很快就把API都摸透了，自己折腾着做了个HTML5的魔都的地铁线路图，能拖能拽的，还和电子地图做了交互。哥决定把小弟的成果给大家展示一下。</span></span></span></span></span></p><p>&nbsp;</p><p><strong><span id="wmd-input-section-3"><span h1"=""><span md-hash"="" md=""><span lf"=""><span p"=""><span link"=""><span md=""  md-bracket-start"=""><span md=""  md-underlined-text"=""><span md=""  md-bracket-end"=""><span md=""  md-href"=""><span md=""  md-paren-end"=""><span lf"=""><span id="wmd-input-section-4"><span h1"=""><span md-hash"="" md="">效果图对比</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></strong></p><p>&nbsp;</p><p><span id="wmd-input-section-3"><span h1"=""><span md-hash"="" md=""><span lf"=""><span p"=""><span link"=""><span md=""  md-bracket-start"=""><span md=""  md-underlined-text"=""><span md=""  md-bracket-end"=""><span md=""  md-href"=""><span md=""  md-paren-end"=""><span lf"=""><span id="wmd-input-section-4"><span h1"=""><span md-hash"="" md=""><span lf"=""><span p"="">网上的地铁图还是很多的，小弟选了这张比较新的做参考。想当年哥来魔都打拼时，图上可就一红一绿打个叉&#8230;&#8230;暴露年龄的话不多说，看图：</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p><p><span h1"=""><span md-hash"="" md=""><span lf"=""><span p"=""><span link"=""><span md=""  md-bracket-start"=""><span md=""  md-underlined-text"=""><span md=""  md-bracket-end"=""><span md=""  md-href"=""><span md=""  md-paren-end"=""><span lf"=""><span><span h1"=""><span md-hash"="" md=""><span lf"=""><span p"=""><img alt="" src="http://images2015.cnblogs.com/blog/311983/201611/311983-20161103121614533-2062155906.jpg" /></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p><p><span p"="">再来看看小弟做的：<br /><br /></span></p><p><span p"=""><img alt="" src="http://images2015.cnblogs.com/blog/311983/201611/311983-20161103121656721-376610979.jpg" /></span></p><p><span p"="">我是一眼看不出区别，但这可不是一张效果图，而是一个新手仅用了几天做出来的东西，而且里面许多美化和调整是通过程序自动完成的，这就不容易了。更重要的是，它并不是一张死图，而是纯矢量、可交互、有动态效果、无失真缩放的拓扑图！我们先简单看一下交互效果，后面可以详细说说代码的实现。</span></p><p>&nbsp;</p><p><strong><span p"="">文本提示弹弹弹</span></strong></p><p>&nbsp;</p><p><span p"=""><span p"="">首先，把鼠标移到站点、路段、图标等位置，都会有文本提示弹出，这个比较基本，百度家的就有，小弟也就放了比较简单的弹出内容。如果加上基本介绍啊、相关提示啊、周边信息啊&#8230;&#8230;要是加上广告，就可以赚钱了&#8230;&#8230;反正什么都可以加嘛，就是一个setToolTip命令而已。</span></span></p><p>&nbsp;</p><p><img alt="" src="http://images2015.cnblogs.com/blog/311983/201611/311983-20161103121921361-1178958456.gif" /></p><p>&nbsp;</p><p><strong>站点图标变变变</strong></p><p>&nbsp;</p><p><span p"="">当鼠标移到站点上时，站点图标做了放大效果，这个效果很贴心，看了下百度家，用的是发光效果。</span></p><p>&nbsp;</p><p><span p"=""><img alt="" src="http://images2015.cnblogs.com/blog/311983/201611/311983-20161103122154049-1255275872.gif" /></span></p><p>&nbsp;</p><p><span p"="">实现的方法也很简便，就是在注册站点矢量图形时，加入了动态判断。以下注册普通站点矢量图形的代码：</span></p></div><strong></strong><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">twaver.Util.registerImage(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">station</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,{<br />&nbsp;&nbsp;&nbsp;&nbsp;w:&nbsp;linkWidth</span><span style="color: #000000; ">*</span><span style="color: #000000; ">1.6</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;h:&nbsp;linkWidth</span><span style="color: #000000; ">*</span><span style="color: #000000; ">1.6</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;v:&nbsp;function&nbsp;(data,&nbsp;view)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;result&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;[];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(data.getClient(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">focus</span><span style="color: #000000; ">'</span><span style="color: #000000; ">)){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.push({<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shape:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">circle</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r:&nbsp;linkWidth</span><span style="color: #000000; ">*</span><span style="color: #000000; ">0.7</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lineColor:&nbsp;&nbsp;data.getClient(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">lineColor</span><span style="color: #000000; ">'</span><span style="color: #000000; ">),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lineWidth:&nbsp;linkWidth</span><span style="color: #000000; ">*</span><span style="color: #000000; ">0.2</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fill:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">white</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.push({<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shape:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">circle</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r:&nbsp;linkWidth</span><span style="color: #000000; ">*</span><span style="color: #000000; ">0.2</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fill:&nbsp;&nbsp;data.getClient(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">lineColor</span><span style="color: #000000; ">'</span><span style="color: #000000; ">),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.push({<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shape:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">circle</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r:&nbsp;linkWidth</span><span style="color: #000000; ">*</span><span style="color: #000000; ">0.6</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lineColor:&nbsp;data.getClient(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">lineColor</span><span style="color: #000000; ">'</span><span style="color: #000000; ">),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lineWidth:&nbsp;linkWidth</span><span style="color: #000000; ">*</span><span style="color: #000000; ">0.2</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fill:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">white</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;result;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />});</span></div><br /><div><p><strong>动画效果拽拽拽</strong></p><p>&nbsp;</p><p><span p"="">从上图还可以看到，在换乘站图标中，除了增加了颜色，还实现了旋转效果。这个就秒杀百度家了。<span lf"=""> <span p"="">来看代码：</span></span></span></p></div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">twaver.Util.registerImage(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">rotateArrow</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;w:&nbsp;</span><span style="color: #000000; ">124</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;h:&nbsp;</span><span style="color: #000000; ">124</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;v:&nbsp;[{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shape:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">vector</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">doubleArrow</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rotate:&nbsp;</span><span style="color: #000000; ">360</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;animate:&nbsp;[{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;attr:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">rotate</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to:&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dur:&nbsp;</span><span style="color: #000000; ">2000</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reverse:&nbsp;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;repeat:&nbsp;Number.POSITIVE_INFINITY<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}]<br />&nbsp;&nbsp;&nbsp;&nbsp;}]<br />});</span></div><br /><div><p><span p"="">当然这对于TWaver来说也很容易，只不过对rotate属性进行了动态改变而已。<span lf"=""> <span lf"=""><span p"="">另外，在单击和双击站点时，还实现了selected和loading的动画效果，值得点赞！</span></span></span></span></p><p>&nbsp;</p><p><span p"=""><span lf"=""><span lf"=""><span p"=""><img alt="" src="http://images2015.cnblogs.com/blog/311983/201611/311983-20161103141545565-2010504104.gif" /><img alt="" src="http://images2015.cnblogs.com/blog/311983/201611/311983-20161103141605065-1237423734.gif" /></span></span></span></span></p><p>&nbsp;</p><p>&nbsp;</p><p><strong>混合缩放炫炫炫</strong></p><p>&nbsp;</p><p><span p"="">无失真缩放是矢量图的先天优势，小弟也掌握得炉火纯青，把TWaver的混合缩放模式用到极致，还有缩放比例控制、文字自动隐藏等小功能，方便订制。</span></p><p>&nbsp;</p><p><span p"=""><img alt="" src="http://images2015.cnblogs.com/blog/311983/201611/311983-20161103141731096-1466288424.gif" /></span></p><p>&nbsp;</p><p><span p"="">代码也不复杂：</span></p></div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">network.setZoomManager(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;twaver.vector.MixedZoomManager(network));<br />network.setMinZoom(</span><span style="color: #000000; ">0.2</span><span style="color: #000000; ">);<br />network.setMaxZoom(</span><span style="color: #000000; ">3</span><span style="color: #000000; ">);<br />network.setZoomVisibilityThresholds({<br />&nbsp;&nbsp;&nbsp;&nbsp;label&nbsp;:&nbsp;</span><span style="color: #000000; ">0.6</span><span style="color: #000000; ">,<br />});</span></div><br /><div><p><strong>交互功能用起来</strong></p><p>&nbsp;</p><p><span p"="">小弟很自豪地给我介绍这个功能：图标可以自由拖动，松开后会自动弹回。哥问小弟这有什么用，他一本正经地说：证明图是活的！</span></p><p>&nbsp;</p><p><span p"=""><img alt="" src="http://images2015.cnblogs.com/blog/311983/201611/311983-20161103141931643-856207231.gif" /></span></p><p>&nbsp;</p><p>&nbsp;</p><p><span p"="">好吧你赢了，虽然是个没什么卵用的功能，但闲的蛋疼的时候可以随便玩上几十分钟我也是信的。</span></p><p>&nbsp;</p><p><strong><span p"="">连续单击同一站点</span></strong></p><p>&nbsp;</p><p><span p"=""><span p"="">连续单击同一站点（注意不是双击），可以将经过此站点的所有线路突出显示出来。小弟说加入这个功能纯粹因为简单易做，我&#8230;&#8230;竟然表示非常理解，谁年轻时没耍过这类轻松又讨好的小招数呢？</span></span></p><p>&nbsp;</p><p><span p"=""><span p"=""><img alt="" src="http://images2015.cnblogs.com/blog/311983/201611/311983-20161103143834486-1796262740.gif" /></span></span></p><p>&nbsp;</p><p>&nbsp;</p><p><strong>双击站点</strong></p><p>&nbsp;</p><p><span p"="">双击站点，竟然弹出了本站周边的电子地图！知道引入他山之玉，看来小子可教啊。我发现他的定位方法，有的是用经纬度，有的是关键词查询。小弟狡黠地说，开始是人工查每个站点经纬度的，干了一段儿发现太麻烦，后来改路子了。马大大说的，懒人改变世界，我服!</span></p><p>&nbsp;</p><p><span p"=""><img alt="" src="http://images2015.cnblogs.com/blog/311983/201611/311983-20161103143940158-1173344247.gif" /></span></p><p>&nbsp;</p><p>&nbsp;</p><p><span p"="">最后来八一八程序设计的思路吧，小弟是棵好苗子，能做出那么像样的程序，必然是深思熟虑过的。不想再听我啰嗦的朋友，也可以直接发邮件给我，<span link"=""><span md=""  md-bracket-start"=""><span md=""  md-underlined-text"="">tw-service@servasoft.com<span md=""  md-bracket-end"=""><span md=""  md-href"=""><span md=""  md-paren-end"="">，来鉴赏下小弟的成果。</span></span></span></span></span></span></span></p><p>&nbsp;</p><p><strong><span p"=""><span link"=""><span md=""  md-bracket-start"=""><span md=""  md-underlined-text"=""><span md=""  md-bracket-end"=""><span md=""  md-href"=""><span md=""  md-paren-end"="">数据文件的整理</span></span></span></span></span></span></span></strong></p><p>&nbsp;</p><p><span p"=""><span link"=""><span md=""  md-bracket-start"=""><span md=""  md-underlined-text"=""><span md=""  md-bracket-end"=""><span md=""  md-href"=""><span md=""  md-paren-end"=""><span p"="">数据格式，选择了JavaScript原生支持的json文件，直观方便。<span lf"=""> <span p"="">数据结构，按照站点、线路、杂项三大块来组织，结构清晰，利于遍历、查询等操作。</span></span></span></span></span></span></span></span></span></span></p><p>&nbsp;</p></div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">stations</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">l01s01</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:{&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230;&#8230;&#8230;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">lines</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">l01</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:{&#8230;&#8230;},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230;&#8230;&#8230;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">sundrys</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">railwaystationshanghai</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:{&#8230;&#8230;},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230;&#8230;&#8230;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</span></div><br /><div><span p"="">命名比较规范，通过名字就可以看出基本信息（例如&#8220;l01s01&#8221;就是1号线第1个站点），甚至直接利用名字就可以进行查询和遍历。</span></div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">l01s01</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">id</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">l01s01</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">name</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">莘庄</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">loc</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:{</span><span style="color: #000000; ">"</span><span style="color: #000000; ">x</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:</span><span style="color: #000000; ">419</span><span style="color: #000000; ">,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">y</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:</span><span style="color: #000000; ">1330</span><span style="color: #000000; ">},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">label</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">bottomright.bottomright</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230;&#8230;&#8230;</span></div><br /><div><p><strong>站点路线的创建</strong></p><p>&nbsp;</p><p><span p"="">首先是读取json文件的数据。</span></p></div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;loadJSON(path,callback){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;xhr&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;XMLHttpRequest();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xhr.onreadystatechange&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;function(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(xhr.readyState&nbsp;</span><span style="color: #000000; ">===</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">4</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(xhr.status&nbsp;</span><span style="color: #000000; ">===</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">200</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataJson&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;JSON.parse(xhr.responseText);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;callback&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;callback();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xhr.open(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">GET</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;path,&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xhr.send();<br />&nbsp;&nbsp;&nbsp;&nbsp;}</span></div><br /><div><span p"="">因为读取文件是一个异步的过程，所以要程序的展开都要放在文件读取函数的内部。</span></div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;init(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loadJSON(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">shanghaiMetro.json</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;function(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initNetwork(dataJson);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initNode(dataJson);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;}</span></div><br /><div><span p"="">只要通过对站点进行一次遍历，车站的建立就完成了。</span></div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(staId&nbsp;in&nbsp;json.stations){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;station&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;json.stations[staId];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;staNode&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;twaver.Node({<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id:&nbsp;staId,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name:&nbsp;station.name,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;image:</span><span style="color: #000000; ">'</span><span style="color: #000000; ">station</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;staNode.s(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">label.color</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,</span><span style="color: #000000; ">'</span><span style="color: #000000; ">rgba(99,99,99,1)</span><span style="color: #000000; ">'</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;staNode.s(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">label.font</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,</span><span style="color: #000000; ">'</span><span style="color: #000000; ">12px&nbsp;微软雅黑</span><span style="color: #000000; ">'</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;staNode.s(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">label.position</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,station.label);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;staNode.setClient(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">location</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,station.loc);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;box.add(staNode);<br />&nbsp;&nbsp;&nbsp;&nbsp;}</span></div><br /><div><span p"="">再对数据文件中的各条线路下的所有站点进行遍历，在站点间依次创建Link。</span></div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(lineId&nbsp;in&nbsp;json.lines)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(staSn&nbsp;in&nbsp;line.stations)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;link&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;twaver.Link(linkId,prevSta,staNode);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;link.s(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">link.color</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,&nbsp;line.color);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;link.s(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">link.width</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,&nbsp;linkWidth);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;link.setToolTip(line.name);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;box.add(link);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}</span></div><br /><div><p><span p"="">再对label位置进行调整，否则站点名称会显示的很乱。小弟是通过在原始数据中手动加入位置信息来实现的，稍显笨了一点，应该可以通过程序自动判断站点周围空间来进行智能调整。<span lf"=""> <span lf"=""><span p"="">最后再加入图标，一张原始的地铁图就呈现出来了。</span></span></span></span></p><p>&nbsp;</p><p><span p"=""><img alt="" src="http://images2015.cnblogs.com/blog/311983/201611/311983-20161103144715205-1780446914.png" /></span></p><p>&nbsp;</p><p>&nbsp;</p><p><strong>路线拐点的添加</strong></p><p>&nbsp;</p><p><span p"="">基本的示意功能已经具备了，这里，小弟让我很欣赏的一点是没有就此停止，而是进一步做了调整，使线路只保留了横平竖直和正斜的走向，以达到整齐美观的效果。可能看起来与参考图稍稍有些不同，主要因为各路段基本只添加了一个拐点，这样做既大大简化了程序，又基本保证了图形的美观度。想远一点，做多一点，是块做产品的好料子。</span></p><p>&nbsp;</p><p><span p"=""><img alt="" src="http://images2015.cnblogs.com/blog/311983/201611/311983-20161103144816315-1456837843.png" /></span></p><p>&nbsp;</p><p><span p"="">当然为了提高程序的灵活性，应对必须添加两个或以上拐点的情况，也使用了人工拐点的手段。不过这里人工拐点被设成一个隐形的节点，可能利于智能拐点的判断，但也有可能在路线操作时造成混乱。如何处理更好还可以进一步推敲。</span></p></div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">var&nbsp;createTurnSta&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;function(line,&nbsp;staSn){<br />&nbsp;&nbsp;&nbsp;&nbsp;staTurn&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;twaver.Node(staSn);<br />&nbsp;&nbsp;&nbsp;&nbsp;staTurn.setImage();<br />&nbsp;&nbsp;&nbsp;&nbsp;staTurn.setClient(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">lineColor</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,line.color);<br />&nbsp;&nbsp;&nbsp;&nbsp;staTurn.setClient(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">lines</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,[line.id]);<br />&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;loc&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;line.stations[staSn];<br />&nbsp;&nbsp;&nbsp;&nbsp;staTurn.setClient(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">location</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,loc);<br />&nbsp;&nbsp;&nbsp;&nbsp;box.add(staTurn);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;staTurn;<br />}</span></div><br /><div><p><strong>接点位置的调整</strong></p><p>&nbsp;</p><p><span p"="">大家可以看到，并不是所有路段都直接连入站点中心，在许多情况下必须要进行偏移。</span></p></div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">var&nbsp;createFollowSta&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;function(json,&nbsp;line,&nbsp;staNode,&nbsp;staId){<br />&nbsp;&nbsp;&nbsp;&nbsp;staFollow&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;twaver.Follower(staId);<br />&nbsp;&nbsp;&nbsp;&nbsp;staFollow.setImage();<br />&nbsp;&nbsp;&nbsp;&nbsp;staFollow.setClient(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">lineColor</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,line.color);<br />&nbsp;&nbsp;&nbsp;&nbsp;staFollow.setClient(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">lines</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,[line.id]);<br />&nbsp;&nbsp;&nbsp;&nbsp;staFollow.setHost(staNode);<br />&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;az&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;azimuth[staId.substr(</span><span style="color: #000000; ">6</span><span style="color: #000000; ">,</span><span style="color: #000000; ">2</span><span style="color: #000000; ">)];<br />&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;loc0&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;json.stations[staId.substr(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">6</span><span style="color: #000000; ">)].loc;<br />&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;loc&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;{x:loc0.x</span><span style="color: #000000; ">+</span><span style="color: #000000; ">az.x,&nbsp;y:loc0.y</span><span style="color: #000000; ">+</span><span style="color: #000000; ">az.y};<br />&nbsp;&nbsp;&nbsp;&nbsp;staFollow.setClient(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">location</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,loc);<br />&nbsp;&nbsp;&nbsp;&nbsp;box.add(staFollow);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;staFollow;<br />}</span></div><br /><div><p>&nbsp;</p><p><img alt="" src="http://images2015.cnblogs.com/blog/311983/201611/311983-20161103144955643-1549309486.png" /></p><p>&nbsp;</p><p><span p"="">小弟采取了虚拟节点的办法，就是在站点的旁边，添加一个Follower（但并不显示出来），让并行的不同线路连接到不同的Follower上。通过调整Follower的位置，来实现线路与站点连接点的控制。</span></p></div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">var&nbsp;azimuth&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;bb:&nbsp;{x:&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;y:&nbsp;linkWidth</span><span style="color: #000000; ">*</span><span style="color: #000000; ">zoom</span><span style="color: #000000; ">/</span><span style="color: #000000; ">2</span><span style="color: #000000; ">},<br />&nbsp;&nbsp;&nbsp;&nbsp;tt:&nbsp;{x:&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;y:&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">linkWidth</span><span style="color: #000000; ">*</span><span style="color: #000000; ">zoom</span><span style="color: #000000; ">/</span><span style="color: #000000; ">2</span><span style="color: #000000; ">},<br />&nbsp;&nbsp;&nbsp;&nbsp;rr:&nbsp;{x:&nbsp;linkWidth</span><span style="color: #000000; ">*</span><span style="color: #000000; ">zoom</span><span style="color: #000000; ">/</span><span style="color: #000000; ">2</span><span style="color: #000000; ">,&nbsp;y:&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">},<br />&nbsp;&nbsp;&nbsp;&nbsp;ll:&nbsp;{x:&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">linkWidth</span><span style="color: #000000; ">/</span><span style="color: #000000; ">2</span><span style="color: #000000; ">,&nbsp;y:&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">},<br />&nbsp;&nbsp;&nbsp;&nbsp;br:&nbsp;{x:&nbsp;linkWidth</span><span style="color: #000000; ">*</span><span style="color: #000000; ">zoom</span><span style="color: #000000; ">*</span><span style="color: #000000; ">0.7</span><span style="color: #000000; ">/</span><span style="color: #000000; ">2</span><span style="color: #000000; ">,&nbsp;y:&nbsp;linkWidth</span><span style="color: #000000; ">*</span><span style="color: #000000; ">zoom</span><span style="color: #000000; ">*</span><span style="color: #000000; ">0.7</span><span style="color: #000000; ">/</span><span style="color: #000000; ">2</span><span style="color: #000000; ">},<br />&nbsp;&nbsp;&nbsp;&nbsp;bl:&nbsp;{x:&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">linkWidth</span><span style="color: #000000; ">*</span><span style="color: #000000; ">zoom</span><span style="color: #000000; ">*</span><span style="color: #000000; ">0.7</span><span style="color: #000000; ">/</span><span style="color: #000000; ">2</span><span style="color: #000000; ">,&nbsp;y:&nbsp;linkWidth</span><span style="color: #000000; ">*</span><span style="color: #000000; ">zoom</span><span style="color: #000000; ">*</span><span style="color: #000000; ">0.7</span><span style="color: #000000; ">/</span><span style="color: #000000; ">2</span><span style="color: #000000; ">},<br />&nbsp;&nbsp;&nbsp;&nbsp;tr:&nbsp;{x:&nbsp;linkWidth</span><span style="color: #000000; ">*</span><span style="color: #000000; ">zoom</span><span style="color: #000000; ">*</span><span style="color: #000000; ">0.7</span><span style="color: #000000; ">/</span><span style="color: #000000; ">2</span><span style="color: #000000; ">,&nbsp;y:&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">linkWidth</span><span style="color: #000000; ">*</span><span style="color: #000000; ">zoom</span><span style="color: #000000; ">*</span><span style="color: #000000; ">0.7</span><span style="color: #000000; ">/</span><span style="color: #000000; ">2</span><span style="color: #000000; ">},<br />&nbsp;&nbsp;&nbsp;&nbsp;tl:&nbsp;{x:&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">linkWidth</span><span style="color: #000000; ">*</span><span style="color: #000000; ">zoom</span><span style="color: #000000; ">*</span><span style="color: #000000; ">0.7</span><span style="color: #000000; ">/</span><span style="color: #000000; ">2</span><span style="color: #000000; ">,&nbsp;y:&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">linkWidth</span><span style="color: #000000; ">*</span><span style="color: #000000; ">zoom</span><span style="color: #000000; ">*</span><span style="color: #000000; ">0.7</span><span style="color: #000000; ">/</span><span style="color: #000000; ">2</span><span style="color: #000000; ">},<br />&nbsp;&nbsp;&nbsp;&nbsp;BB:&nbsp;{x:&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;y:&nbsp;linkWidth</span><span style="color: #000000; ">*</span><span style="color: #000000; ">zoom},<br />&nbsp;&nbsp;&nbsp;&nbsp;TT:&nbsp;{x:&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;y:&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">linkWidth</span><span style="color: #000000; ">*</span><span style="color: #000000; ">zoom},<br />&nbsp;&nbsp;&nbsp;&nbsp;RR:&nbsp;{x:&nbsp;linkWidth</span><span style="color: #000000; ">*</span><span style="color: #000000; ">zoom,&nbsp;y:&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">},<br />&nbsp;&nbsp;&nbsp;&nbsp;LL:&nbsp;{x:&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">linkWidth,&nbsp;y:&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">},<br />&nbsp;&nbsp;&nbsp;&nbsp;BR:&nbsp;{x:&nbsp;linkWidth</span><span style="color: #000000; ">*</span><span style="color: #000000; ">zoom</span><span style="color: #000000; ">*</span><span style="color: #000000; ">0.7</span><span style="color: #000000; ">,&nbsp;y:&nbsp;linkWidth</span><span style="color: #000000; ">*</span><span style="color: #000000; ">zoom</span><span style="color: #000000; ">*</span><span style="color: #000000; ">0.7</span><span style="color: #000000; ">},<br />&nbsp;&nbsp;&nbsp;&nbsp;BL:&nbsp;{x:&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">linkWidth</span><span style="color: #000000; ">*</span><span style="color: #000000; ">zoom</span><span style="color: #000000; ">*</span><span style="color: #000000; ">0.7</span><span style="color: #000000; ">,&nbsp;y:&nbsp;linkWidth</span><span style="color: #000000; ">*</span><span style="color: #000000; ">zoom</span><span style="color: #000000; ">*</span><span style="color: #000000; ">0.7</span><span style="color: #000000; ">},<br />&nbsp;&nbsp;&nbsp;&nbsp;TR:&nbsp;{x:&nbsp;linkWidth</span><span style="color: #000000; ">*</span><span style="color: #000000; ">zoom</span><span style="color: #000000; ">*</span><span style="color: #000000; ">0.7</span><span style="color: #000000; ">,&nbsp;y:&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">linkWidth</span><span style="color: #000000; ">*</span><span style="color: #000000; ">zoom</span><span style="color: #000000; ">*</span><span style="color: #000000; ">0.7</span><span style="color: #000000; ">},<br />&nbsp;&nbsp;&nbsp;&nbsp;TL:&nbsp;{x:&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">linkWidth</span><span style="color: #000000; ">*</span><span style="color: #000000; ">zoom</span><span style="color: #000000; ">*</span><span style="color: #000000; ">0.7</span><span style="color: #000000; ">,&nbsp;y:&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">linkWidth</span><span style="color: #000000; ">*</span><span style="color: #000000; ">zoom</span><span style="color: #000000; ">*</span><span style="color: #000000; ">0.7</span><span style="color: #000000; ">}<br />};</span></div><br /><div><span p"="">介绍到这里就结束了，虽然是个小例子，但美观性和实用性都还过得去，小弟花了心思去做，其实稍加改造就可以做出高铁图、公交图、运行图等应用。设想一下，如果能用在轨道交通列控中心大屏监控里，是多么炫酷。说到这，又想起了前段时间云栖大会上刚看到的杭州城市数据大脑，不知何时，哥也能参与一把那样的项目呢？可视化，哥的强项&#8230;&#8230;<span lf"=""> <span lf"=""><span p"="">最后，想要看程序，或者想玩&#8220;地铁拖拖乐&#8221;的各位，都可以给我留言和发邮件：<span link"=""><span md=""  md-bracket-start"=""><span md=""  md-underlined-text"="">tw-service@servasoft.com<span md=""  md-bracket-end"=""><span md=""  md-href"=""><span md=""  md-paren-end"="">。</span></span></span></span></span></span></span></span></span></span></div><img src ="http://www.blogjava.net/TWaver/aggbug/432072.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TWaver/" target="_blank">TWaver</a> 2016-12-13 14:36 <a href="http://www.blogjava.net/TWaver/archive/2016/12/13/432072.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>10个TWaver网页3D可视化精彩案例</title><link>http://www.blogjava.net/TWaver/archive/2016/12/09/432065.html</link><dc:creator>TWaver</dc:creator><author>TWaver</author><pubDate>Fri, 09 Dec 2016 07:29:00 GMT</pubDate><guid>http://www.blogjava.net/TWaver/archive/2016/12/09/432065.html</guid><wfw:comment>http://www.blogjava.net/TWaver/comments/432065.html</wfw:comment><comments>http://www.blogjava.net/TWaver/archive/2016/12/09/432065.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TWaver/comments/commentRss/432065.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TWaver/services/trackbacks/432065.html</trackback:ping><description><![CDATA[<div><p>以下网页3D案例均为TWaver原创出品，推荐使用Chrome, FireFox, Safari等对WebGL支持良好的浏览器运行。案例排名不分先后，如需Demo，可直接申请试用。</p><p><br />1、化学元素周期表</p><p><br />六种排列方式，炫酷动画效果，TWaver 3D轻松实现。<br /><br /></p><div><img title="在这里输入图片标题" alt="输入图片说明" src="https://static.oschina.net/uploads/img/201612/13111509_UQ7u.gif" /></div><p><br />演示地址：<a href="http://demo.servasoft.com/chemical-table/">http://demo.servasoft.com/chemical-table/</a></p><p><br />2、DNA螺旋图<br /><br /></p><div><img title="在这里输入图片标题" alt="输入图片说明" src="https://static.oschina.net/uploads/img/201612/09150039_6rlU.png" /></div><p><br />DNA3D模型，包含几千个球体（几十万个面），高性能渲染，搭配丰富色彩和光照效果，可用于医疗三维可视化。</p><p><br />演示地址：<a href="http://demo.servasoft.com/dna/">http://demo.servasoft.com/dna/</a> </p><p><br />3、3D手表</p><p><br />细腻的皮革质感，镜面反射效果，指针动画，真实时间显示。<br /><br /></p><div><img title="在这里输入图片标题" alt="输入图片说明" src="https://static.oschina.net/uploads/img/201612/09150110_LiYj.png" /></div><p><br />演示地址：<a href="http://demo.servasoft.com/watch/">http://demo.servasoft.com/watch/</a></p><p><br />4、3D拓扑图之花团锦簇</p><p><br />艳丽多姿的3D小球花，不足百行代码即可实现。<br /><br /></p><div><img title="在这里输入图片标题" alt="输入图片说明" src="https://static.oschina.net/uploads/img/201612/09150144_Drwm.jpg" /></div><p><br />演示地址：<a href="http://demo.servasoft.com/tuopu/">http://demo.servasoft.com/tuopu/</a></p><p><br />5、3D拓扑图之人在江湖</p><p><br />使用立体拓扑图来展示错综复杂的关系网，事半功倍！<br /><br /> </p><div><img title="在这里输入图片标题" alt="输入图片说明" src="https://static.oschina.net/uploads/img/201612/09150211_PkRn.png" /></div><p><br />演示地址：<a href="http://demo.servasoft.com/person/">http://demo.servasoft.com/person/</a>  </p><p><br />6、地球卫星运行模拟</p><p><br />星球大战，一触即发！<br /><br /></p><p><img alt="" src="http://www.blogjava.net/images/blogjava_net/twaver/卫星.gif" border="0" /></p><p><br />演示地址：<a href="http://demo.servasoft.com/earth/">http://demo.servasoft.com/earth/</a>  </p><p><br />7、CNC机床监控</p><p><br />工厂三维可视化，助力工业4.0+智能制造时代。<br /><br /></p><p><img title="" alt="这里写图片描述" src="http://img.blog.csdn.net/20161209112141021?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdHdhdmVy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" /></p><p><br />演示地址：<a href="http://demo.servasoft.com/cnc/">http://demo.servasoft.com/cnc/</a></p><p><br />8、加气站三维可视化</p><p><br />加气站分布站点广，安全要求高，通过三维可视化监控，提升安全水平和紧急事件的处理能力。<br /><br /></p><p><img title="" alt="这里写图片描述" src="http://img.blog.csdn.net/20161209112235694?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdHdhdmVy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" /></p><p><br />演示地址：<a href="http://demo.servasoft.com/pipe/">http://demo.servasoft.com/pipe/</a></p><p><br />9、库房三维可视化<br /><br /></p><p>可对接仓库资产管理系统，让仓库管理更加智能化。<br /><br /></p><p><img alt="" src="http://www.blogjava.net/images/blogjava_net/twaver/warehouse.gif" border="0" /></p><p><br />演示地址：<a href="http://demo.servasoft.com/demoWarehouese/">http://demo.servasoft.com/demoWarehouese/</a></p><p><br />10、3D小机房<br /><br /></p><p>汇聚资产、动环、告警、安防管理和监控一体的3D机房小程序，经典的，就是最好的。<br /><br /></p><p><img title="" alt="这里写图片描述" src="http://img.blog.csdn.net/20161209112418700?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdHdhdmVy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" /></p><p><br />演示地址：<a href="http://demo.servasoft.com/room/">http://demo.servasoft.com/room/</a></p></div><strong></strong><img src ="http://www.blogjava.net/TWaver/aggbug/432065.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TWaver/" target="_blank">TWaver</a> 2016-12-09 15:29 <a href="http://www.blogjava.net/TWaver/archive/2016/12/09/432065.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HTML5数据可视化第三弹：萌萌哒拓扑图分组</title><link>http://www.blogjava.net/TWaver/archive/2016/12/02/432037.html</link><dc:creator>TWaver</dc:creator><author>TWaver</author><pubDate>Fri, 02 Dec 2016 02:26:00 GMT</pubDate><guid>http://www.blogjava.net/TWaver/archive/2016/12/02/432037.html</guid><wfw:comment>http://www.blogjava.net/TWaver/comments/432037.html</wfw:comment><comments>http://www.blogjava.net/TWaver/archive/2016/12/02/432037.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TWaver/comments/commentRss/432037.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TWaver/services/trackbacks/432037.html</trackback:ping><description><![CDATA[<div><p><strong>前言</strong>&nbsp;</p><p>最近忙着给客户折腾一个复杂的多层嵌套关系。客户一句话&#8220;要好看！&#8221;，哥就忙白了头啊，还好最终搞定了。</p><p>&nbsp;</p><p><strong>需求描述</strong>&nbsp;</p><p>先简单描述下这次客户的需求。</p><p>现实应用中，网络拓扑图结构可能很简单，也可能非常复杂。</p><p>比如这种节点较多的单层拓扑：<br /><br /></p><p><br /><img style="display: inline; cursor: pointer;" alt="" src="https://segmentfault.com/img/bVmpWB" /></p><p>稍复杂一些的：<br /><br /></p><p><br /><img style="display: inline; cursor: pointer;" alt="" src="https://segmentfault.com/img/bVmpWD" /></p><p>&nbsp;</p><p>再复杂一些的：</p><p><br /><img style="display: inline; cursor: pointer;" alt="" src="https://segmentfault.com/img/bVmpWE" /></p><p>&nbsp;</p><p>在这些拓扑图中常见的场景是，很多网络节点需要组成一组，这常被称为&#8220;网元组&#8221;。一般来说，网元组会有一个形状，双击可以展开/闭合。如下图：</p><p><br /><img style="display: inline; cursor: pointer;" alt="" src="https://segmentfault.com/img/bVmpWT" /></p><p><img style="display: inline; cursor: pointer;" alt="" src="https://segmentfault.com/img/bVmpWU" /></p><p>&nbsp;</p><p>这次客户的需求中，最大的难点就是需要有五层网元组的嵌套，五层同时展开时，要求清晰美观。常规的分组形状有圆形、矩形、平行四边形等，无论哪种形状，分组多了后，就会产生审美疲劳。比如，我让设计师mm简单地把五层嵌套画个图，它看起来会是这样：</p><p><br /><img width="700" height="414" title="点击查看原始大小图片" style="display: inline; cursor: pointer;" alt="" src="https://segmentfault.com/img/bVmpXl" /></p><p>&nbsp;</p><p>我把这个图给客户看了以后，客户表示希望&#8220;结构能够更加清晰&#8221;。那天，魔都大雨倾盆，我抓耳挠腮一个下午，终于有了一些灵感。</p><p>&nbsp;</p><p><strong>颜色</strong>&nbsp;</p><p>怎样才能使得结构效果更加清晰？我想到的是用颜色。颜色永远是图形设计里面的第一要素。如果分组颜色千篇一律，自然就看不太清楚包含关系。但是颜色太多五颜六色，显然也不符合电信UI系统的风格。那颜色要如何设置呢？层层嵌套的分组，层层&#8230;&#8230;叮！你有没有想到一种蔬菜？</p><p>&nbsp;</p><p><img style="display: inline; cursor: pointer;" alt="" src="https://segmentfault.com/img/bVmpXx" /></p><p>&nbsp;&nbsp;</p><p>（此处哼唱&#8220;如果你可以一层一层一层地剥开我的心&#8230;&#8230;&#8221;一百遍&#8230;&#8230;）</p><p>这颗大洋葱看上去层次分明，是因为它的颜色从内到外有一定规律的变化：渐变。说到渐变，又想起最近GF推荐的一枚游戏，大概内容是按照颜色的渐变规律来排列一些方块。（很无聊有没有？）</p><p>&nbsp;</p><p><img style="display: inline; cursor: pointer;" alt="" src="https://segmentfault.com/img/bVmpXE" /></p><p>&nbsp;</p><p>不过，前端设计中，配色倒是很重要的一个环节。</p><p>总之，想好了用渐变的配色来使嵌套组更清晰后，就大胆地尝试一下：</p></div><strong></strong><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">var&nbsp;group&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;twaver.Group();<br />group.setStyle(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">group.fill.color</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,&nbsp;style[</span><span style="color: #000000; ">3</span><span style="color: #000000; ">]);<br />group.setStyle(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">group.deep</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br />group.setStyle(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">group.outline.width</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,&nbsp;style[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]);<br />group.setStyle(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">group.outline.color</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,&nbsp;style[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]);<br />group.setStyle(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">group.shape</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">roundrect</span><span style="color: #000000; ">'</span><span style="color: #000000; ">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />group.setStyle(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">select.style</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">none</span><span style="color: #000000; ">'</span><span style="color: #000000; ">);<br />group.setStyle(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">vector.outline.pattern</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,&nbsp;style[</span><span style="color: #000000; ">2</span><span style="color: #000000; ">]);<br />group.setStyle(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">label.font</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">14px&nbsp;"Microsoft&nbsp;Yahei"</span><span style="color: #000000; ">'</span><span style="color: #000000; ">);<br />group.setStyle(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">whole.alpha</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0.8</span><span style="color: #000000; ">);<br />group.setStyle(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">group.padding</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">10</span><span style="color: #000000; ">);<br />group.setStyle(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">label.position</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">topright.topleft</span><span style="color: #000000; ">'</span><span style="color: #000000; ">);<br />group.setName(name);<br />group.setLocation(</span><span style="color: #000000; ">100</span><span style="color: #000000; ">+</span><span style="color: #000000; ">150</span><span style="color: #000000; ">*</span><span style="color: #000000; ">level,&nbsp;</span><span style="color: #000000; ">300</span><span style="color: #000000; ">);<br /><br />box.add(group);&nbsp;&nbsp;</span></div><br /><div><p>数据量更大的时候，看看分组是不是会更加清晰？</p><p><br /><img width="700" height="532" title="点击查看原始大小图片" style="display: inline; cursor: pointer;" alt="" src="https://segmentfault.com/img/bVmpXT" /></p><h2>&nbsp;</h2><p><strong>更多颜色</strong></p><p>这个图做出来之后，拿给周围几个同事看，大家纷纷表示不错，但是似乎有一些死板，不够生动。生动。。那就是要活灵活现的，于是我继续抓耳挠腮，又想到了一些瓜果蔬菜：</p><p>&nbsp;</p><p><img style="display: inline; cursor: pointer;" alt="" src="https://segmentfault.com/img/bVmpX2" /></p><p><img style="display: inline; cursor: pointer;" alt="" src="https://segmentfault.com/img/bVmpX7" /></p><p>&nbsp;</p><p>果然还是配色不够明艳啊。我又让设计师mm给找了几个色值调整了一下：</p><p><br /><img width="700" height="396" title="点击查看原始大小图片" style="display: inline; cursor: pointer;" alt="" src="https://segmentfault.com/img/bVmpYd" /><br /><br /></p><p><strong>折角</strong></p><p>有了写花瓣层叠的感觉，是不是舒服多了？不过，方方正正的组的形状，还是太死板，缺乏立体感。看到桌子上的一张折了角的白纸，突然有了灵感。</p><p>给方形的组做一个折角效果，不知效果如何。要做这个效果，就要重写group的绘制，自己接管2d绘制了。Group的形状将不再是一个矩形，而是一个切角的矩形。</p><p>&nbsp;</p></div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">draw&nbsp;round&nbsp;rect&nbsp;body.</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">var&nbsp;roundRadius</span><span style="color: #000000; ">=</span><span style="color: #000000; ">10</span><span style="color: #000000; ">;<br />ctx.save();<br />ctx.beginPath();<br />ctx.moveTo(rect.x</span><span style="color: #000000; ">+</span><span style="color: #000000; ">roundRadius,&nbsp;rect.y);<br />ctx.lineTo(rect.x</span><span style="color: #000000; ">+</span><span style="color: #000000; ">rect.width</span><span style="color: #000000; ">-</span><span style="color: #000000; ">60</span><span style="color: #000000; ">,&nbsp;rect.y);<br />ctx.lineTo(rect.x</span><span style="color: #000000; ">+</span><span style="color: #000000; ">rect.width,&nbsp;rect.y</span><span style="color: #000000; ">+</span><span style="color: #000000; ">28</span><span style="color: #000000; ">);<br />ctx.lineTo(rect.x</span><span style="color: #000000; ">+</span><span style="color: #000000; ">rect.width,&nbsp;rect.y</span><span style="color: #000000; ">+</span><span style="color: #000000; ">rect.height</span><span style="color: #000000; ">-</span><span style="color: #000000; ">roundRadius);<br />ctx.quadraticCurveTo(rect.x</span><span style="color: #000000; ">+</span><span style="color: #000000; ">rect.width,&nbsp;rect.y</span><span style="color: #000000; ">+</span><span style="color: #000000; ">rect.height,&nbsp;rect.x</span><span style="color: #000000; ">+</span><span style="color: #000000; ">rect.width</span><span style="color: #000000; ">-</span><span style="color: #000000; ">roundRadius,&nbsp;rect.y</span><span style="color: #000000; ">+</span><span style="color: #000000; ">rect.height);<br />ctx.lineTo(rect.x</span><span style="color: #000000; ">+</span><span style="color: #000000; ">roundRadius,&nbsp;rect.y</span><span style="color: #000000; ">+</span><span style="color: #000000; ">rect.height);<br />ctx.quadraticCurveTo(rect.x,&nbsp;rect.y</span><span style="color: #000000; ">+</span><span style="color: #000000; ">rect.height,&nbsp;rect.x,&nbsp;rect.y</span><span style="color: #000000; ">+</span><span style="color: #000000; ">rect.height</span><span style="color: #000000; ">-</span><span style="color: #000000; ">roundRadius);<br />ctx.lineTo(rect.x,&nbsp;rect.y</span><span style="color: #000000; ">+</span><span style="color: #000000; ">roundRadius);<br />ctx.quadraticCurveTo(rect.x,&nbsp;rect.y,&nbsp;rect.x</span><span style="color: #000000; ">+</span><span style="color: #000000; ">roundRadius,&nbsp;rect.y);<br />ctx.save();<br />ctx.shadowOffsetX&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">4</span><span style="color: #000000; ">;<br />ctx.shadowOffsetY&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">4</span><span style="color: #000000; ">;<br />ctx.shadowBlur&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">4</span><span style="color: #000000; ">;<br />ctx.shadowColor&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">#555555</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />ctx.fill();<br />ctx.restore();<br />ctx.lineWidth</span><span style="color: #000000; ">=</span><span style="color: #000000; ">node.getStyle(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">group.outline.width</span><span style="color: #000000; ">'</span><span style="color: #000000; ">);<br />ctx.strokeStyle</span><span style="color: #000000; ">=</span><span style="color: #000000; ">node.getStyle(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">group.outline.color</span><span style="color: #000000; ">'</span><span style="color: #000000; ">);<br />ctx.stroke();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />ctx.restore();</span></div><br /><div><p>通过绘制一个带圆角的矩形并切掉一个角，stroke到画布上。看看效果：</p><p>&nbsp;</p><p>&nbsp;</p><p><img width="700" height="368" title="点击查看原始大小图片" alt="这里写图片描述" src="http://img.blog.csdn.net/20150716191536606" /></p><p>&nbsp;</p><p>再通过增加圆角、切角、增加阴影、设置不同的边框线宽，让分组进一步产生&#8220;层层递进&#8221;的感觉。现在就剩下画折角的细节了。</p><p>折角这里，需要画一个被折下来的直角三角形。三角形的颜色，应该是&#8220;纸&#8221;的背面颜色。这里小心定义三角形的形状，并进行填充：</p></div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">draw&nbsp;corlor.</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">ctx.fillStyle</span><span style="color: #000000; ">=</span><span style="color: #000000; ">node.getStyle(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">group.outline.color</span><span style="color: #000000; ">'</span><span style="color: #000000; ">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />ctx.lineWidth</span><span style="color: #000000; ">=</span><span style="color: #000000; ">node.getStyle(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">group.outline.width</span><span style="color: #000000; ">'</span><span style="color: #000000; ">);<br />ctx.lineJoin</span><span style="color: #000000; ">=</span><span style="color: #000000; ">'</span><span style="color: #000000; ">bevel</span><span style="color: #000000; ">'</span><span style="color: #000000; ">;<br />ctx.beginPath();<br />ctx.moveTo(rect.x</span><span style="color: #000000; ">+</span><span style="color: #000000; ">rect.width</span><span style="color: #000000; ">-</span><span style="color: #000000; ">60</span><span style="color: #000000; ">,&nbsp;rect.y);<br />ctx.lineTo(rect.x</span><span style="color: #000000; ">+</span><span style="color: #000000; ">rect.width</span><span style="color: #000000; ">-</span><span style="color: #000000; ">23</span><span style="color: #000000; ">-</span><span style="color: #000000; ">10</span><span style="color: #000000; ">,&nbsp;rect.y</span><span style="color: #000000; ">+</span><span style="color: #000000; ">47</span><span style="color: #000000; ">-</span><span style="color: #000000; ">10</span><span style="color: #000000; ">);<br />ctx.quadraticCurveTo(rect.x</span><span style="color: #000000; ">+</span><span style="color: #000000; ">rect.width</span><span style="color: #000000; ">-</span><span style="color: #000000; ">23</span><span style="color: #000000; ">,&nbsp;rect.y</span><span style="color: #000000; ">+</span><span style="color: #000000; ">46</span><span style="color: #000000; ">,&nbsp;rect.x</span><span style="color: #000000; ">+</span><span style="color: #000000; ">rect.width</span><span style="color: #000000; ">-</span><span style="color: #000000; ">23</span><span style="color: #000000; ">+</span><span style="color: #000000; ">10</span><span style="color: #000000; ">,&nbsp;rect.y</span><span style="color: #000000; ">+</span><span style="color: #000000; ">47</span><span style="color: #000000; ">-</span><span style="color: #000000; ">10</span><span style="color: #000000; ">);<br />ctx.lineTo(rect.x</span><span style="color: #000000; ">+</span><span style="color: #000000; ">rect.width,&nbsp;rect.y</span><span style="color: #000000; ">+</span><span style="color: #000000; ">28</span><span style="color: #000000; ">);<br />ctx.closePath();<br />ctx.save();<br />ctx.shadowOffsetX&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">4</span><span style="color: #000000; ">;<br />ctx.shadowOffsetY&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">4</span><span style="color: #000000; ">;<br />ctx.shadowBlur&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">4</span><span style="color: #000000; ">;<br />ctx.shadowColor&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">#777777</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />ctx.fill();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />ctx.restore();<br />ctx.strokeStyle</span><span style="color: #000000; ">=</span><span style="color: #000000; ">node.getStyle(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">group.outline.color</span><span style="color: #000000; ">'</span><span style="color: #000000; ">);<br />ctx.stroke();&nbsp;</span></div><br /><div><p>效果如下，立体感出来以后，是不是生动了很多？</p><p>&nbsp;</p><p><img width="700" height="367" title="点击查看原始大小图片" alt="这里写图片描述" src="http://img.blog.csdn.net/20150716191613181" /></p><p>&nbsp;</p><p>这里要注意的是，折角的阴影也要设置，并且填充要使用和边框相同的颜色，增加&#8220;折纸&#8221;的立体感。</p><h2>&nbsp;</h2><p><strong>小细节</strong></p><p>折纸效果有了，不过左侧上方略显空旷，于是利用canvas的2d来练练手，画个path看看：</p></div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">ctx.save();<br />ctx.strokeStyle</span><span style="color: #000000; ">=</span><span style="color: #000000; ">'</span><span style="color: #000000; ">#27A3DA</span><span style="color: #000000; ">'</span><span style="color: #000000; ">;<br />ctx.lineWidth</span><span style="color: #000000; ">=</span><span style="color: #000000; ">2</span><span style="color: #000000; ">;<br />ctx.beginPath();<br />ctx.moveTo(rect.x</span><span style="color: #000000; ">+</span><span style="color: #000000; ">31</span><span style="color: #000000; ">,&nbsp;rect.y</span><span style="color: #000000; ">+</span><span style="color: #000000; ">5</span><span style="color: #000000; ">);<br />ctx.lineTo(rect.x</span><span style="color: #000000; ">+</span><span style="color: #000000; ">25</span><span style="color: #000000; ">,&nbsp;rect.y</span><span style="color: #000000; ">+</span><span style="color: #000000; ">20</span><span style="color: #000000; ">);<br />ctx.bezierCurveTo(rect.x</span><span style="color: #000000; ">+</span><span style="color: #000000; ">25</span><span style="color: #000000; ">,&nbsp;rect.y</span><span style="color: #000000; ">+</span><span style="color: #000000; ">26</span><span style="color: #000000; ">,&nbsp;rect.x</span><span style="color: #000000; ">+</span><span style="color: #000000; ">28</span><span style="color: #000000; ">,&nbsp;rect.y</span><span style="color: #000000; ">+</span><span style="color: #000000; ">28</span><span style="color: #000000; ">,&nbsp;rect.x</span><span style="color: #000000; ">+</span><span style="color: #000000; ">32</span><span style="color: #000000; ">,&nbsp;rect.y</span><span style="color: #000000; ">+</span><span style="color: #000000; ">23</span><span style="color: #000000; ">);<br />ctx.lineTo(rect.x</span><span style="color: #000000; ">+</span><span style="color: #000000; ">42</span><span style="color: #000000; ">,&nbsp;rect.y</span><span style="color: #000000; ">-</span><span style="color: #000000; ">2</span><span style="color: #000000; ">);<br />ctx.bezierCurveTo(rect.x</span><span style="color: #000000; ">+</span><span style="color: #000000; ">42</span><span style="color: #000000; ">,&nbsp;rect.y</span><span style="color: #000000; ">-</span><span style="color: #000000; ">12</span><span style="color: #000000; ">,&nbsp;rect.x</span><span style="color: #000000; ">+</span><span style="color: #000000; ">32</span><span style="color: #000000; ">,&nbsp;rect.y</span><span style="color: #000000; ">-</span><span style="color: #000000; ">10</span><span style="color: #000000; ">,&nbsp;rect.x</span><span style="color: #000000; ">+</span><span style="color: #000000; ">32</span><span style="color: #000000; ">,&nbsp;rect.y</span><span style="color: #000000; ">-</span><span style="color: #000000; ">5</span><span style="color: #000000; ">);<br />ctx.lineTo(rect.x</span><span style="color: #000000; ">+</span><span style="color: #000000; ">29</span><span style="color: #000000; ">,&nbsp;rect.y</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br /><br />ctx.shadowOffsetX&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />ctx.shadowOffsetY&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />ctx.shadowBlur&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />ctx.shadowColor&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">#aaaaaa</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />ctx.stroke();<br />ctx.restore();</span></div><br /><div><p>运行一下，你猜是神马？</p><p>&nbsp;</p><p><img width="700" height="329" title="点击查看原始大小图片" alt="这里写图片描述" src="http://img.blog.csdn.net/20150716191639438" /></p><p>&nbsp;</p><p>哈哈，一个小回形针瞬间跃然纸上了，感觉萌萌哒！为了增加立体感，回形针也是要设置阴影的，不过偏移不要太大、颜色要淡一些，像这样：</p><p><img title="" alt="这里写图片描述" src="http://img.blog.csdn.net/20150716191701957" /></p><p>&nbsp;</p><p>&nbsp;</p><p>适当明艳的色彩，加上折角、阴影和小回形针，这回这个层层嵌套总算是清晰又好看了吧？</p><p>运行一下，拖拖拽拽，因为之前已经做了不少图标、线条的样式，所以总体效果还是很不错的！</p><p>&nbsp;</p><p><img width="699" height="437" title="点击查看原始大小图片" alt="这里写图片描述" src="http://img.blog.csdn.net/20150716191729150" /></p><p><img width="700" height="366" title="点击查看原始大小图片" alt="这里写图片描述" src="http://img.blog.csdn.net/20150716192033162" /></p><h2><br /></h2><p><strong>后记</strong>&nbsp;</p><p>之前也说，HTML5的canvas，虽然已经不是什么新鲜技术了，但当技术本身不再有壁垒，我们更应该注重的是实际业务中的应用，比如在画这种组织结构关系非常复杂的拓扑图时，如何让图形更加清晰、易懂，让技术真正落到实处。如果你有更加好的这类拓扑图的解决方案，也可以和我联系交流：tw-service@servasoft.com</p><p>&nbsp;<br /><br /></p></div><img src ="http://www.blogjava.net/TWaver/aggbug/432037.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TWaver/" target="_blank">TWaver</a> 2016-12-02 10:26 <a href="http://www.blogjava.net/TWaver/archive/2016/12/02/432037.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TWaver3D拓扑图之人在江湖</title><link>http://www.blogjava.net/TWaver/archive/2016/11/24/432009.html</link><dc:creator>TWaver</dc:creator><author>TWaver</author><pubDate>Thu, 24 Nov 2016 02:03:00 GMT</pubDate><guid>http://www.blogjava.net/TWaver/archive/2016/11/24/432009.html</guid><wfw:comment>http://www.blogjava.net/TWaver/comments/432009.html</wfw:comment><comments>http://www.blogjava.net/TWaver/archive/2016/11/24/432009.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TWaver/comments/commentRss/432009.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TWaver/services/trackbacks/432009.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 俗话说，有人的地方就有江湖，江湖就是帮派林立错综复杂的关系网。今天我们就来展示这样一个小小的江湖。故事背景崇祯末年，民不聊生，烽烟四起&#8230;&#8230;江湖都是有背景的，我们的3D江湖也需要一个背景。江湖就是一个舞台，舞台就要有空间、场地、灯光和观众。在我们的3D舞台中，box就是空间，容纳所有物体；network就是场地，展示千姿百态；PointLight和AmbientLight就是...&nbsp;&nbsp;<a href='http://www.blogjava.net/TWaver/archive/2016/11/24/432009.html'>阅读全文</a><img src ="http://www.blogjava.net/TWaver/aggbug/432009.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TWaver/" target="_blank">TWaver</a> 2016-11-24 10:03 <a href="http://www.blogjava.net/TWaver/archive/2016/11/24/432009.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TWaver3D拓扑图之球花绽放 </title><link>http://www.blogjava.net/TWaver/archive/2016/11/23/432007.html</link><dc:creator>TWaver</dc:creator><author>TWaver</author><pubDate>Wed, 23 Nov 2016 02:32:00 GMT</pubDate><guid>http://www.blogjava.net/TWaver/archive/2016/11/23/432007.html</guid><wfw:comment>http://www.blogjava.net/TWaver/comments/432007.html</wfw:comment><comments>http://www.blogjava.net/TWaver/archive/2016/11/23/432007.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TWaver/comments/commentRss/432007.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TWaver/services/trackbacks/432007.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 这样一簇绚烂丰满艳丽多姿的3D小球花，要多少代码才能完成？其实不足百行，您信吗？下面咱就看一下具体实现过程，让您分分钟学会用TWaver HTML5制作3D拓扑图。搭建3D空间首先为花簇的绽放建一个展示的舞台。接触过TWaver2D的都知道，box、network是必不可少的，但对3D场景来说，还远远不够。一是要添加镜头位置，确定我们在什么角度和距离进行观察；二是要加上灯光，否则再美的画面也看不见...&nbsp;&nbsp;<a href='http://www.blogjava.net/TWaver/archive/2016/11/23/432007.html'>阅读全文</a><img src ="http://www.blogjava.net/TWaver/aggbug/432007.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TWaver/" target="_blank">TWaver</a> 2016-11-23 10:32 <a href="http://www.blogjava.net/TWaver/archive/2016/11/23/432007.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一款最新的Web 3D开发工具—TWaver Make </title><link>http://www.blogjava.net/TWaver/archive/2016/11/22/432006.html</link><dc:creator>TWaver</dc:creator><author>TWaver</author><pubDate>Tue, 22 Nov 2016 02:35:00 GMT</pubDate><guid>http://www.blogjava.net/TWaver/archive/2016/11/22/432006.html</guid><wfw:comment>http://www.blogjava.net/TWaver/comments/432006.html</wfw:comment><comments>http://www.blogjava.net/TWaver/archive/2016/11/22/432006.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TWaver/comments/commentRss/432006.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TWaver/services/trackbacks/432006.html</trackback:ping><description><![CDATA[<div><p>在我们协助客户进行3D应用的开发过程中，客户遇到的最头疼的问题是如何在短时间内学会使用TWaver 3D引擎，以及使用TWaver 3D来创建和导入项目所需的各种3D业务模型。由于项目涵盖的行业繁多、对模型种类和精度的需求各异，为了降低TWaver底层引擎的使用难度，TWaver发布了一款全新的模型库框架TWaver&#174; Make，来帮助开发者快速创建高质量、专业的行业可视化应用场景。</p><p>&nbsp;</p><p>简单来说，TWaver&#174; Make提供的是模版定义的开发SDK框架，和高质量的跨行业模型库。使用TWaver&#174; Make，可以把TWaver 2D/3D的代码细节包装在模版中进行复用，极大的降低使用TWaver的复杂度，提高开发效率。</p><p>&nbsp;</p><p><span style="color: #ff6600; font-size: 16px;"><strong>模型定义</strong></span></p><p>&nbsp;</p><p>TWaver&#174; Make基于Javascript对各类资源进行模版化定义，它的核心只有2个函数：</p><p>make.Default.register进行模版定义；</p><p>make.Default.load进行模型加载。</p><p>&nbsp;</p><p>通过数据的模版化，可以实现各类资源的标准化、快速共享与复用。</p><p>&nbsp;</p><p>TWaver&#174; Make 可以快速定义：</p><p>&nbsp;</p><p>- TWaver HTML5 2D拓扑图&nbsp;</p><p>- TWaver Mono 3D模型&nbsp;</p><p>- HTML片段、eChart等第三方ui组件&nbsp;</p><p>- 字符串、数据、图片、文件等资源&nbsp;</p><p>&nbsp;</p><p><span style="font-size: 16px;"><strong><span style="color: #ff6600;">模型加载</span></strong></span></p><p>&nbsp;</p><p>TWaver&#174; Make模型库提供了大量高精度、专业的行业预制2D、3D模型库，可以直接使用。模型库就像一本字典一样，开发着只需查阅模型id，就可以通过load方法快速加载使用这些内置模型。</p><p>&nbsp;</p><p>例如，下面代码调用了Make中预定义的电力变电站中的变压器模型。已知变压器模型的id为twaver.grid.transformer，则：<br /><br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">var&nbsp;transformer&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;make.Default.load(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">twaver.grid.transformer</span><span style="color: #000000; ">'</span><span style="color: #000000; ">);&nbsp;&nbsp;<br />network3d.getDataBox().addByDescendant(transformer);&nbsp;&nbsp;</span></div><p><strong></strong><em></em><u></u><sub></sub><sup></sup><strike></strike><br /></p><div><p><img width="500" height="458" alt="" src="http://img.blog.csdn.net/20160413170621883" /></p><p>&nbsp;</p><p>这样一来，很快就可以搭建出一个变电站的场景了：<br /><br /></p><p><img width="700" height="428" title="点击查看原始大小图片" alt="" src="http://img.blog.csdn.net/20160413170721523" /></p><p>&nbsp;</p><p><span style="font-size: 16px;"><strong><span style="color: #ff6600;">预置模型</span></strong></span></p><p>&nbsp;</p><p>TWaver&#174; Make提供了大量行业预制模型库，可供开发者直接使用。包括各类2D拓扑图及样式、3D模型、工业监控组件，涵盖电信、电力、数据中心、工业自动化等领域。从机房、机柜、服务器、灭火器，到人物、花草、建筑、道路，行业模板库包罗万象，供您所用。当然，您也可以轻松对模板库进行扩展。</p><p>&nbsp;</p><p>TWaver&#174; Make 模型库涵盖领域：</p><p>&nbsp;</p><p>- 电信</p><p>- 电力</p><p>- 数据中心</p><p>- 仓储物流</p><p>&nbsp;</p><p><span style="font-size: 16px;"><strong><span style="color: #ff6600;">模型扩展<br /><br /></span></strong></span></p><p>如果TWaver&#174; Make的专业模型库还不能满足您的业务需求，欢迎联系我们，我们将为您提供专业的模型扩展定制服务。</p><p>&nbsp;</p><p>最后，我们用一张图来简单说明TWaver&#174; Make在整个TWaver产品体系中的位置：</p><p>&nbsp;</p><p><img width="470" height="305" alt="" src="http://img.blog.csdn.net/20160413165251366" /></p><p>&nbsp;</p><p>可以看到，TWaver&#174; Make位于TWaver 3D引擎上层，包含了开发框架和模板库，如果把搭建系统比喻成盖大楼，那么TWaver 2D和3D就像沙土和水泥，而TWaver&#174; Make的就像是各种标准的&#8220;砖头&#8221;，盖房子的过程，也就变成了&#8220;搭积木&#8221;的过程。盖大楼，也不再需要从挖土烧砖开始，可以让设计师将更多的精力专注在建筑结构和功能设计上。</p><p>&nbsp;</p><p>如果您对Make感兴趣，或者有3D应用开发的需求，不妨<a href="http://servasoft.com/downloads" target="_blank">下载TWaver&#174; Make</a>试试。有任何问题，也可以留言，或者发邮件给我们：tw-service@servasoft.com。</p></div><p><strong></strong><br /></p></div><strong></strong><img src ="http://www.blogjava.net/TWaver/aggbug/432006.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TWaver/" target="_blank">TWaver</a> 2016-11-22 10:35 <a href="http://www.blogjava.net/TWaver/archive/2016/11/22/432006.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>两步创建3D数据中心 </title><link>http://www.blogjava.net/TWaver/archive/2016/11/21/432001.html</link><dc:creator>TWaver</dc:creator><author>TWaver</author><pubDate>Mon, 21 Nov 2016 03:25:00 GMT</pubDate><guid>http://www.blogjava.net/TWaver/archive/2016/11/21/432001.html</guid><wfw:comment>http://www.blogjava.net/TWaver/comments/432001.html</wfw:comment><comments>http://www.blogjava.net/TWaver/archive/2016/11/21/432001.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TWaver/comments/commentRss/432001.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TWaver/services/trackbacks/432001.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: TWaver 3D发布也有很长一段时间了，相关的应用和项目也做了不少，特别是3D机房，可是有些用户反馈说3D机房开发起来有些费劲，耗时，3D并不像2D，虽然有时更加的直观，但是需要考虑的问题也很多。本文着重介绍了如何通过两个简单的步骤来创建出一个3D数据中心。<br>&nbsp;&nbsp;<a href='http://www.blogjava.net/TWaver/archive/2016/11/21/432001.html'>阅读全文</a><img src ="http://www.blogjava.net/TWaver/aggbug/432001.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TWaver/" target="_blank">TWaver</a> 2016-11-21 11:25 <a href="http://www.blogjava.net/TWaver/archive/2016/11/21/432001.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HTML5数据可视化第二弹：打造最美3D机房</title><link>http://www.blogjava.net/TWaver/archive/2016/11/18/431997.html</link><dc:creator>TWaver</dc:creator><author>TWaver</author><pubDate>Fri, 18 Nov 2016 02:29:00 GMT</pubDate><guid>http://www.blogjava.net/TWaver/archive/2016/11/18/431997.html</guid><wfw:comment>http://www.blogjava.net/TWaver/comments/431997.html</wfw:comment><comments>http://www.blogjava.net/TWaver/archive/2016/11/18/431997.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TWaver/comments/commentRss/431997.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TWaver/services/trackbacks/431997.html</trackback:ping><description><![CDATA[<div><p><br />自TWaver 3D产品发布以来，TWaver 3D的定位一直在于为企业提供3D应用的快速开发工具，方便企业开发适合自己的高效、实时的监控系统。<br /><br />基于这样的产品定位，我们在过去的一年多时间里，一直将重心放在提升引擎效率，增加可视化工具上。对于我们的优势应用行业&#8212;&#8212;电信行业，我们在3D机房应用上做了比较多的优化和定制。近期，有不少客户向我们提出，总觉用TWaver 3D开发出来的界面，不像主流的3D效果那么精美。首先，我们想说，效果图终归是效果图，和实际的系统一般来说还是有一些差异。其次，3D Max这些专业3D建模工具，和TWaver并不是对立的，而是相辅相成的工具。我们已经支持将3D max的文件导入TWaver进行展示，也正在研究使得TWaver能对接更多的模型类型。大家可以一起讨论，如何让TWaver的3D模型做得更好。最后，我们始终相信，作为开发工具的我们，是前途无限的，因此我们决定挑战一下效果图，看看TWaver的3D效果，到底有多强。<br /><br />首先我们先找来一张效果图，真的是效果图哦~~<br /><br /></p></div><strong></strong><div><img width="640" height="402" alt="HTML5 3D机房3" src="http://servasoft.com/wp-content/uploads/2015/06/HTML5-3D机房3-640x402.png" sizes="(max-width: 640px) 100vw, 640px"  wp-image-9838"="" size-medium="" /></div><br /><strong></strong><div><p>这张效果图和TWaver 3D以往的demo风格都大不相同，我们就来按图索个机房吧~</p><p><strong><br />地板<br /><br /></strong></p><p>第一个要做，也是应该比较简单的，就是地板。这个地板应该是一个有点厚度、有格子贴图的薄薄立方体平面。还好经过封装，就写一段json对象就能定义了：</p></div><strong></strong><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">{<br />name:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">地板</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />type:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">cube</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />width:&nbsp;</span><span style="color: #000000; ">1600</span><span style="color: #000000; ">,<br />height:&nbsp;</span><span style="color: #000000; ">10</span><span style="color: #000000; ">,<br />depth:&nbsp;</span><span style="color: #000000; ">1300</span><span style="color: #000000; ">,<br />&nbsp;<br />style:&nbsp;{<br /></span><span style="color: #000000; ">'</span><span style="color: #000000; ">m.color</span><span style="color: #000000; ">'</span><span style="color: #000000; ">:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">#BEC9BE</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br /></span><span style="color: #000000; ">'</span><span style="color: #000000; ">m.ambient</span><span style="color: #000000; ">'</span><span style="color: #000000; ">:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">#BEC9BE</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />}<br />}<br /></span></div><br /><div><p>通过定义，创建了一个13米*16米的地板块：<br /><img width="640" height="283" alt="HTML5 3D机房4" src="http://servasoft.com/wp-content/uploads/2015/06/HTML5-3D机房4-640x283.png" sizes="(max-width: 640px) 100vw, 640px" size-medium=""  wp-image-9839"="" /></p><p>调整到合适的角度看，效果还不错，但颜色欠缺了些，需要找一个材质纹理图。纹理图的尺寸都需要是宽和高都是2的幂，例如128&#215;128、256*256等，这样出来效果才会好。这也是3D软件一般所要求的。另外纹理要能连续拼接不露破绽，这样才好。例如下面我google出来的图：<br /><br /><img width="128" height="128" alt="HTML5 3D机房5" src="http://twaver.servasoft.com/wp-content/uploads/2015/06/HTML5-3D机房5.png"  wp-image-9840"="" size-full="" /></p><p><br />在style里面添加：</p></div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">'</span><span style="color: #000000; ">top.m.texture.image</span><span style="color: #000000; ">'</span><span style="color: #000000; ">:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">images/floor.png</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br /></span><span style="color: #000000; ">'</span><span style="color: #000000; ">top.m.texture.repeat</span><span style="color: #000000; ">'</span><span style="color: #000000; ">:&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;mono.Vec2(</span><span style="color: #000000; ">10</span><span style="color: #000000; ">,</span><span style="color: #000000; ">10</span><span style="color: #000000; ">),<br /></span></div><br /><div><p>效果如下：<br /><img width="640" height="247" alt="HTML5 3D机房6" src="http://servasoft.com/wp-content/uploads/2015/06/HTML5-3D机房6-640x247.png" sizes="(max-width: 640px) 100vw, 640px" size-medium=""  wp-image-9841"="" /></p><p>虽然不是很华丽，但作为机房的地板，也绰绰有余了。好像有点so easy，决定加大难度，给地板加一个方便运送设备的斜坡！<br /><br /><img width="461" height="193" alt="HTML5 3D机房7" src="http://twaver.servasoft.com/wp-content/uploads/2015/06/HTML5-3D机房7.png" size-full=""  wp-image-9842"="" /></p><p>这里就给大家普及下TWaver的好处了。Twaver里面的对象可以支持运算，这个斜坡，可以定义一个斜的立方体，让地板剪掉立方体，应该可以做到。于是继续定义json：</p></div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">{<br />&nbsp;&nbsp;&nbsp;&nbsp;name:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">地板切坡</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;type:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">cube</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;width:&nbsp;</span><span style="color: #000000; ">200</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;height:&nbsp;</span><span style="color: #000000; ">20</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;depth:&nbsp;</span><span style="color: #000000; ">260</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;translate:&nbsp;[</span><span style="color: #000000; ">-</span><span style="color: #000000; ">348</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">530</span><span style="color: #000000; ">],<br />&nbsp;&nbsp;&nbsp;&nbsp;rotate:&nbsp;[Math.PI</span><span style="color: #000000; ">/</span><span style="color: #000000; ">180</span><span style="color: #000000; ">*</span><span style="color: #000000; ">3</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">],<br />&nbsp;&nbsp;&nbsp;&nbsp;op:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">-</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;style:&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;,<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br /></span></div><br /><div><p>这里定义的一个倾斜的立方体，通过translate定义位置，通过rotate定义旋转角度，然后再通过op定义运算符，这里是&#8220;减去&#8221;，就用&#8220;-&#8221;。被剪掉的立方体也可以设置材质、纹理、贴图、颜色&#8230;.等等。看看效果：<br /><img width="640" height="315" alt="HTML5 3D机房8" src="http://servasoft.com/wp-content/uploads/2015/06/HTML5-3D机房8-640x315.png" sizes="(max-width: 640px) 100vw, 640px" size-medium=""  wp-image-9843"="" /></p><p><strong>走廊桌<br /></strong><br /> 效果图的房间有点狭窄，决定加一条宽敞的走廊，并在走廊上放一个接待桌。对于桌子这种没有业务属性的对象，为了简单就偷懒做一个立方体表示吧！这个简单，继续使用上述办法：</p></div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">{<br />&nbsp;&nbsp;&nbsp;&nbsp;name:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">走廊板凳</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;type:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">cube</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;width:&nbsp;</span><span style="color: #000000; ">300</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;height:&nbsp;</span><span style="color: #000000; ">50</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;depth:&nbsp;</span><span style="color: #000000; ">100</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;translate:&nbsp;[</span><span style="color: #000000; ">350</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">500</span><span style="color: #000000; ">],<br />&nbsp;&nbsp;}<br /></span></div><br /><div><img width="640" height="360" alt="HTML5 3D机房9" src="http://servasoft.com/wp-content/uploads/2015/06/HTML5-3D机房9-640x360.png" sizes="(max-width: 640px) 100vw, 640px" size-medium=""  wp-image-9844"="" /></div><div><p>有点简单，再加点阴影效果：<br /><img width="640" height="259" alt="HTML5 3D机房10" src="http://servasoft.com/wp-content/uploads/2015/06/HTML5-3D机房10-640x259.png" sizes="(max-width: 640px) 100vw, 640px" size-medium=""  wp-image-9845"="" /></p><p>简简单单一个接待桌就做好啦！下面继续造房子，盖墙体。</p><p><strong><br />墙体</strong><br /><br /> 墙体是一个不规则的路径，不过放心，TWaver的引擎不光支持不规则路径，连曲线路径都可以噢。所以看上去挺麻烦实际还是比较简单的。在json里面定义一组数字的坐标，让这些数字依次连接，组成一个墙体，最后生成3D对象放入场景中。<br /> Json定义大致如下：</p></div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">{<br />&nbsp;&nbsp;&nbsp;&nbsp;name:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">主墙体</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;type:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">path</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;width:&nbsp;</span><span style="color: #000000; ">20</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;height:&nbsp;</span><span style="color: #000000; ">200</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;translate:&nbsp;[</span><span style="color: #000000; ">-</span><span style="color: #000000; ">500</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">500</span><span style="color: #000000; ">],<br />&nbsp;&nbsp;&nbsp;&nbsp;data:[<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">],<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[</span><span style="color: #000000; ">1000</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">],<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[</span><span style="color: #000000; ">1000</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">500</span><span style="color: #000000; ">],<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[</span><span style="color: #000000; ">500</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">500</span><span style="color: #000000; ">],<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[</span><span style="color: #000000; ">500</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">1000</span><span style="color: #000000; ">],<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">1000</span><span style="color: #000000; ">],<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">],<br />&nbsp;&nbsp;&nbsp;&nbsp;],<br />}<br /></span></div><br /><div><p>注意这里的类型变成了path，data中定义了一个二维坐标数组来描述墙体。由于墙都是从底面开始的，所以只定义它的平面的x、y坐标就行了。吸取刚才的经验教训，启用阴影并咨询设计师美眉几个颜色值加上，看看效果：<br /><img width="640" height="389" alt="HTML5 3D机房12" src="http://servasoft.com/wp-content/uploads/2015/06/HTML5-3D机房12-640x389.png" sizes="(max-width: 640px) 100vw, 640px" size-medium=""  wp-image-9847"="" /></p><p>再瞅瞅细节，好像缺点啥，没门！<br /><br /><img width="640" height="397" alt="HTML5 3D机房13" src="http://servasoft.com/wp-content/uploads/2015/06/HTML5-3D机房13-640x397.png" sizes="(max-width: 640px) 100vw, 640px" size-medium=""  wp-image-9848"="" /></p></div><br /><div><strong>门<br /><br /></strong> 门如果直接放上去，会被墙盖住；如果比墙厚，又难看不符合实际。还是应该先定义一个门洞立方体，把门所在的位置挖掉：</div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">{<br />&nbsp;&nbsp;&nbsp;&nbsp;name:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">门洞</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;type:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">cube</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;width:&nbsp;</span><span style="color: #000000; ">195</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;height:&nbsp;</span><span style="color: #000000; ">170</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;depth:&nbsp;</span><span style="color: #000000; ">30</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;op:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">-</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;translate:[</span><span style="color: #000000; ">-</span><span style="color: #000000; ">350</span><span style="color: #000000; ">,</span><span style="color: #000000; ">2</span><span style="color: #000000; ">,</span><span style="color: #000000; ">500</span><span style="color: #000000; ">],<br />}<br /></span></div><br /><div><p>刚好挖在斜坡的位置，这样设备进屋就方便了：<br /><br /><img width="578" height="378" alt="HTML5 3D机房14" src="http://twaver.servasoft.com/wp-content/uploads/2015/06/HTML5-3D机房14.png" size-full=""  wp-image-9849"="" /></p><p><br />不过这门没有一个门框，感觉不太生动。多一个门框会感觉立体感强一些。门框可以是一个比门洞略大的立方体，在挖门洞之前添加：</p></div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">{<br />&nbsp;&nbsp;&nbsp;&nbsp;name:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">门框</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;type:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">cube</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;width:&nbsp;</span><span style="color: #000000; ">205</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;height:&nbsp;</span><span style="color: #000000; ">180</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;depth:&nbsp;</span><span style="color: #000000; ">26</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;translate:&nbsp;[</span><span style="color: #000000; ">-</span><span style="color: #000000; ">350</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">500</span><span style="color: #000000; ">],<br />&nbsp;&nbsp;&nbsp;&nbsp;op:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">+</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;}<br /></span></div><br /><div><p>加上阴影和光线等综合效果，还不错，挺有档次的。<br /><br /><img width="640" height="446" alt="HTML5 3D机房15" src="http://servasoft.com/wp-content/uploads/2015/06/HTML5-3D机房15-640x446.png" sizes="(max-width: 640px) 100vw, 640px" size-medium=""  wp-image-9850"="" /></p><p><br />还少点东西，对，门还没装上去。作为机房，应该来个清爽透亮的玻璃门。门体较大，就来个双开门吧。门的定义比较简单，就是一个薄的立方体。不过为了做到玻璃效果，要设置透明度，让他看上去更像一个玻璃，再让设计师美眉弄一张好看一点的门的图，贴上去。先做左边的门：</p></div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">{<br />&nbsp;&nbsp;&nbsp;&nbsp;name:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">左门</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;type:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">cube</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;width:&nbsp;</span><span style="color: #000000; ">93</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;height:&nbsp;</span><span style="color: #000000; ">165</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;depth:&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;translate:[</span><span style="color: #000000; ">-</span><span style="color: #000000; ">397</span><span style="color: #000000; ">,</span><span style="color: #000000; ">4</span><span style="color: #000000; ">,</span><span style="color: #000000; ">500</span><span style="color: #000000; ">],<br />&nbsp;&nbsp;&nbsp;&nbsp;style:{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">m.transparent</span><span style="color: #000000; ">'</span><span style="color: #000000; ">:&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">m.texture.image</span><span style="color: #000000; ">'</span><span style="color: #000000; ">:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">images/door_left.png</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span></div><br /><div><p>上面增加的style主要是透明和贴图两项。看看效果：<br /><br /><img width="640" height="385" alt="HTML5 3D机房17" src="http://servasoft.com/wp-content/uploads/2015/06/HTML5-3D机房17-640x385.png" sizes="(max-width: 640px) 100vw, 640px" size-medium=""  wp-image-9852"="" /></p><p><br />再把右边的也加上，位置对称而已，json就不贴了。为了增加体验，门上再设置动画：双击可以自动打开，再双击可以直接关闭。TWaver的动画功能引擎做好了封装，在json中直接指定动画类型就行了。不过要注意左右门的动画旋转方向要相反，要不然一个向里开一个向外开感觉比较怪异。<br /><br /><img width="640" height="437" alt="HTML5 3D机房18" src="http://servasoft.com/wp-content/uploads/2015/06/HTML5-3D机房18-640x437.png" sizes="(max-width: 640px) 100vw, 640px" size-medium=""  wp-image-9853"="" /></p><p><strong><br />窗</strong></p><p><br />有门就要有窗。有窗才有&#8220;窗明几净&#8221;的清爽干净的赶脚。就在门的旁边开一扇大窗户吧！谁不喜欢大窗户呢？方法和门类似，先放窗框后挖窗体。不过为了有点变化，这里不做窗框了，做一个窗台，方法和道理与门相同。</p></div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">{<br />&nbsp;name:&nbsp;&#8216;主窗户洞&#8217;,<br />&nbsp;type:&nbsp;&#8216;cube&#8217;,<br />&nbsp;width:&nbsp;</span><span style="color: #000000; ">420</span><span style="color: #000000; ">,<br />&nbsp;height:&nbsp;</span><span style="color: #000000; ">150</span><span style="color: #000000; ">,<br />&nbsp;depth:&nbsp;</span><span style="color: #000000; ">50</span><span style="color: #000000; ">,<br />&nbsp;translate:&nbsp;[</span><span style="color: #000000; ">200</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">30</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">500</span><span style="color: #000000; ">],<br />&nbsp;op:&nbsp;&#8216;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&#8216;,<br />&nbsp;},{<br />&nbsp;name:&nbsp;&#8216;主窗户台&#8217;,<br />&nbsp;type:&nbsp;&#8216;cube&#8217;,<br />&nbsp;width:&nbsp;</span><span style="color: #000000; ">420</span><span style="color: #000000; ">,<br />&nbsp;height:&nbsp;</span><span style="color: #000000; ">10</span><span style="color: #000000; ">,<br />&nbsp;depth:&nbsp;</span><span style="color: #000000; ">40</span><span style="color: #000000; ">,<br />&nbsp;translate:&nbsp;[</span><span style="color: #000000; ">200</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">30</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">510</span><span style="color: #000000; ">],<br />&nbsp;op:&nbsp;&#8216;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&#8217;,<br />&nbsp;}</span></div><br /><div>定义了一个窗洞（挖掉）、一个窗台（添加）。一个大窗户就做好了：<br /><br /><img width="640" height="382" alt="HTML5 3D机房20" src="http://servasoft.com/wp-content/uploads/2015/06/HTML5-3D机房20-640x382.png" sizes="(max-width: 640px) 100vw, 640px" size-medium=""  wp-image-9855"="" /><p><br />再添加一个略带颜色的透明玻璃。玻璃设置点高光和反射，增加&#8220;玻璃&#8221;感觉：</p></div><strong></strong><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">{<br />&nbsp;&nbsp;&nbsp;&nbsp;name:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">主窗户玻璃</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;type:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">cube</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;width:&nbsp;</span><span style="color: #000000; ">420</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;height:&nbsp;</span><span style="color: #000000; ">150</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;depth:&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;translate:&nbsp;[</span><span style="color: #000000; ">200</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">30</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">500</span><span style="color: #000000; ">],<br />&nbsp;&nbsp;&nbsp;&nbsp;op:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">+</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;style:&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">m.transparent</span><span style="color: #000000; ">'</span><span style="color: #000000; ">:&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">m.opacity</span><span style="color: #000000; ">'</span><span style="color: #000000; ">:</span><span style="color: #000000; ">0.4</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">m.color</span><span style="color: #000000; ">'</span><span style="color: #000000; ">:</span><span style="color: #000000; ">'</span><span style="color: #000000; ">#58ACFA</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;},&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;}<br /></span></div><br /><div><p>Json中玻璃设置了透明度和颜色。这样一个半透明的茶色玻璃就好了：<br /><br /><img width="640" height="297" alt="HTML5 3D机房21" src="http://servasoft.com/wp-content/uploads/2015/06/HTML5-3D机房21-640x297.png" sizes="(max-width: 640px) 100vw, 640px" size-medium=""  wp-image-9856"="" /></p><p><br />到这里突然在想：盖房子如果像写程序一样简单就好了，所有的程序猿就不会是无房一族单身狗了。当然写程序和盖房子一样：该封装好的要封装好，最后就是搭积木组装就行了。如果盖房子都是从挖土活泥巴开始，那就杯具了。写程序也是一样，如果从webgl的main开始写&#8230;.这3D机房的系统要几个月甚至几年才能做出来呢？</p><p><strong><br />外侧墙</strong><br /><br /> 房间外侧的两道走廊隔墙，由于是直线墙，没有复杂走向，直接用立方体定义便可：</p></div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">{<br />&nbsp;&nbsp;&nbsp;&nbsp;name:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">左外墙</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;type:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">cube</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;width:&nbsp;</span><span style="color: #000000; ">20</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;height:&nbsp;</span><span style="color: #000000; ">200</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;depth:&nbsp;</span><span style="color: #000000; ">1300</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;translate:&nbsp;[</span><span style="color: #000000; ">-</span><span style="color: #000000; ">790</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">],<br />&nbsp;&nbsp;&nbsp;&nbsp;op:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">+</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />}<br /></span></div><br /><div><img width="640" height="326" alt="HTML5 3D机房22" src="http://servasoft.com/wp-content/uploads/2015/06/HTML5-3D机房22-640x326.png" sizes="(max-width: 640px) 100vw, 640px" size-medium=""  wp-image-9857"="" /></div><br /><div>再继续挖掉中间的窗户部分,并添加玻璃：</div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">{<br />&nbsp;&nbsp;&nbsp;&nbsp;name:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">左外墙洞</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;type:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">cube</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;width:&nbsp;</span><span style="color: #000000; ">30</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;height:&nbsp;</span><span style="color: #000000; ">110</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;depth:&nbsp;</span><span style="color: #000000; ">1300</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;translate:&nbsp;[</span><span style="color: #000000; ">-</span><span style="color: #000000; ">790</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">60</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">],<br />&nbsp;&nbsp;&nbsp;&nbsp;op:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">-</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />}<br />[</span><span style="color: #000000; ">/</span><span style="color: #000000; ">javacsript]<br />添加玻璃：<br />&nbsp;<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;name:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">左外墙玻璃</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;type:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">cube</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;width:&nbsp;</span><span style="color: #000000; ">4</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;height:&nbsp;</span><span style="color: #000000; ">110</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;depth:&nbsp;</span><span style="color: #000000; ">1300</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;translate:&nbsp;[</span><span style="color: #000000; ">-</span><span style="color: #000000; ">790</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">60</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">],<br />&nbsp;&nbsp;&nbsp;&nbsp;op:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">+</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;style:&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">m.transparent</span><span style="color: #000000; ">'</span><span style="color: #000000; ">:&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">m.opacity</span><span style="color: #000000; ">'</span><span style="color: #000000; ">:</span><span style="color: #000000; ">0.6</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;},<br />}<br /></span></div><br /><div><p><strong>机柜<br /></strong><br /> 最后再来点重点的内容：机柜，以及其中的服务器设备。这才是3D机房里面最终要管理的内容。在我们的实际项目中，这些资产都是在数据库中存储，并通过json接口加载到浏览器中显示。这里为了演示方便，直接写几个机柜的片段，看一下显示效果。</p><p><br />机柜对象在项目中是这样封装的：用一个立方体来表示机柜，并加上贴图。项目中，为了提高显示速度，机柜一开始并不加载内部服务器内容，而是只显示自身一个立方体。当用户双击后，会触发一个延迟加载器，从服务器端加载机柜内部服务器，并加载到对应的位置上。此时，机柜会被挖空成一个空心的立方体，以便视觉上更像一个机柜。</p><p><br />定义机柜的json如下：</p></div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">{<br />&nbsp;&nbsp;&nbsp;&nbsp;name:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">机柜</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;type:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">rack</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;lazy:&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;width:&nbsp;</span><span style="color: #000000; ">70</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;depth:&nbsp;</span><span style="color: #000000; ">100</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;height:&nbsp;</span><span style="color: #000000; ">220</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;translate:&nbsp;[</span><span style="color: #000000; ">-</span><span style="color: #000000; ">370</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">250</span><span style="color: #000000; ">],<br />&nbsp;&nbsp;&nbsp;&nbsp;severity:&nbsp;CRITICAL,<br />&nbsp;&nbsp;}<br /></span></div><br /><div><p>上面的机柜定义中，有一个lazy标记，标记它是否延迟加载其内容。如果延迟加载，则双击触发，否则程序显示时直接加载其内容。Severity是定义了机柜的告警信息，它是否有业务告警。如果有告警，会用一个气泡显示在机柜的上方，同时机柜也会被染色成告警对应的颜色。<br /><br /></p><p><img width="640" height="340" alt="HTML5 3D机房30" src="http://servasoft.com/wp-content/uploads/2015/06/HTML5-3D机房30-640x340.png" sizes="(max-width: 640px) 100vw, 640px" size-medium=""  wp-image-9865"="" /></p><p>继续添加更多的机柜：<br /><br /><img width="640" height="361" alt="HTML5 3D机房31" src="http://servasoft.com/wp-content/uploads/2015/06/HTML5-3D机房31-640x361.png" sizes="(max-width: 640px) 100vw, 640px" size-medium=""  wp-image-9866"="" /><br /><br /><img width="640" height="453" alt="HTML5 3D机房32" src="http://servasoft.com/wp-content/uploads/2015/06/HTML5-3D机房32-640x453.png" sizes="(max-width: 640px) 100vw, 640px" size-medium=""  wp-image-9867"="" /></p></div><br /><div><strong>设备<br /><br /></strong> 简单起见，这里管理的设备假设都是机架设备，尺寸规格比较规整，因此比较容易在机柜中组织。一个设备的外观确定后，在数据库中定义好模板，加载时根据其所在机柜的位置放置即可。这里只是随机生成了几个服务器设备，并按位置摆放。在实际应用中，可以通过手工录入或者智能机架报送的信息来确定服务器的类型和位置。<br /><br /><img width="607" height="480" alt="HTML5 3D机房33" src="http://servasoft.com/wp-content/uploads/2015/06/HTML5-3D机房33-607x480.png" sizes="(max-width: 607px) 100vw, 607px" size-medium=""  wp-image-9868"="" /><br /> <br />如果需要监控到端口级别，还可以在服务器弹出后，再进一步延迟加载设备商的板卡、端口对象，并点击后进一步进行配置、监控等操作。当然加载的数据越细，对3D引擎和浏览器的压力会越大。可以通过动态延迟加载/卸载策略，获取一些平衡折中。</div><strong></strong><br /><div><p>到这里，机房就基本搭建完成了，看下效果，比起效果图，是不是有过之而无不及呢？<br /><br /><img width="640" height="330" alt="HTML5 3D机房35" src="http://servasoft.com/wp-content/uploads/2015/06/HTML5-3D机房35-640x330.png" sizes="(max-width: 640px) 100vw, 640px" size-medium=""  wp-image-9870"="" /></p><p><br />从显示效果来看，基本不输前面看到的广告公司的效果图，但和它和一张死图片太不一样了，我们这是一个能操作、能漫游、能缩放、有动画、显示流畅、浏览器无需插件就能直接打开的3D机房小程序，就一个json文件和一百多行代码和一天的时间就搞定了，还是让人有点惊讶的。不用插件、不用3Dmax，不用模型库，我喜欢这样干干净净纯粹的小程序。小而美、干净而纯粹。手机和平板也能用哦，而且还很流畅！经过优化，场景加载已经控制在600毫秒以内，缩放漫游也很流畅。当然技术和美化永无止境，用户的需求也千变万化绵绵不绝。但只要我们选择好了技术和工具，就能事半功倍。Html5就是极佳的一个选择。<br /><br /><img width="640" height="480" alt="TWaver 3D 机房 完胜效果图" src="http://servasoft.com/wp-content/uploads/2015/07/TWaver-3D-机房-完胜效果图-640x480.png" sizes="(max-width: 640px) 100vw, 640px" size-medium=""  wp-image-9896"="" /></p></div><br /><div>需要相关代码的同学可以发邮件到：tw-service@servasoft.com</div><img src ="http://www.blogjava.net/TWaver/aggbug/431997.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TWaver/" target="_blank">TWaver</a> 2016-11-18 10:29 <a href="http://www.blogjava.net/TWaver/archive/2016/11/18/431997.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HTML5数据可视化第一弹：彩虹爆炸图</title><link>http://www.blogjava.net/TWaver/archive/2016/11/17/431994.html</link><dc:creator>TWaver</dc:creator><author>TWaver</author><pubDate>Thu, 17 Nov 2016 02:52:00 GMT</pubDate><guid>http://www.blogjava.net/TWaver/archive/2016/11/17/431994.html</guid><wfw:comment>http://www.blogjava.net/TWaver/comments/431994.html</wfw:comment><comments>http://www.blogjava.net/TWaver/archive/2016/11/17/431994.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TWaver/comments/commentRss/431994.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TWaver/services/trackbacks/431994.html</trackback:ping><description><![CDATA[<dl><dt><pre><div>25年过去了，Brooks博士著名的&#8220;没有银弹&#8221;的论断依旧没有被打破。HTML5也是一样。但这并不妨碍HTML5是一个越来越有威力的&#8220;炸弹&#8221;：发展迅速、势不可挡。随着HTML5技术的普及，用HTML5做可视化呈现的项目越来越多了。HTML5的优势明显：网页上直接运行无需插件、手机平板方便兼容、代码开发和维护相对容易，等等。一大波一大波的做Java、.NET甚至C++桌面的程序老手们都纷纷开始研究javascript了，而初出茅庐的新一代程序猿更是义无反顾的直奔HTML5这个技术大热点而来。</div></pre></dt></dl><div><br />HTML5涵盖的技术点很多，甚至延伸到了前端、后端、通讯等各个层面。前端的canvas绘图这块无疑是它的核心内容。Canvas的API虽然不是很复杂很强大，但是做一般的2d绘图基本都够用了。基于这些API，一大堆的2d绘图组件纷纷出炉。Echarts、d3.js都是很不错的项目。Echarts主要是chart组件，而d3相对杂一些，很多呈现方式很有创意，值得研究。</div><dl><dt><br />研究d3的起因是最近有一个项目，用户截了一张效果图让我们用HTML5做一下：</dt></dl><strong></strong><img alt="" src="http://dl2.iteye.com/upload/attachment/0108/7066/d4bd4ccf-071d-3578-a226-9f6518dd4e15.png" /><br /><br /><div><p>看着很眼熟，搜了一下，感觉就是d3例子中的sunburst效果，程序在这里：</p><p><a title="http://bl.ocks.org/mbostock/4063423" href="http://bl.ocks.org/mbostock/4063423" target="_blank">http://bl.ocks.org/mbostock/4063423</a></p><p><br />看上去似乎也不难，就是一圈一圈的饼图，把树状结构数据按占比一层一层绘制上去就行了。所以引起了自己动手做一个的兴趣。&#8220;sunburst&#8221;英文里应该是&#8220;云开日出&#8221;的意思，类似强烈的光芒从云层背后透射出来，不知为何中文里大多把它翻译成&#8220;日落&#8221;。比如这把Fender Telecaster吉他型号是Brown Sunburst款，就会被大家翻译成&#8220;日落色&#8221;。</p></div><div><img alt="" src="http://dl2.iteye.com/upload/attachment/0108/7070/d3a692dc-b93b-35c9-935b-88da652e3c35.jpg" /></div><br /><div>关于日出和日落更喜欢哪一个的问题，网上还真有这样的调查。有意思的是，选择喜欢日落的远多于选择日出的。日出代表希望，日落代表成熟，都是一种美，哪个更美要看你个人的心境，因为它的美丽是由心生。为了不在这个问题上站错队，我们还是给他重新起一个更加响亮霸气的中文名字：&#8220;彩虹爆炸图&#8221;，怎么样？</div><strong></strong><br /><div>仔细研究一下彩虹爆炸图的结构，无非就是一个树形结构，并采用发射状的布局。根节点在中间（也可以认为没有唯一的根，而是一堆根节点围绕在第一圈），依次向外发散排列。每一个节点有名称、数值。节点可以按照自身数值在扇区所占比例进行绘制，这样就不用管节点具体数值有多大多小了。</div><br /><div><p>这种图最先是由布朗大学教授John T. Stasko设计。<br /><a title="http://www.cc.gatech.edu/~john.stasko/" href="http://www.cc.gatech.edu/~john.stasko/" target="_blank">http://www.cc.gatech.edu/~john.stasko/</a></p><p><br />经过一天的折腾，终于做出了一个还算过得去的&#8220;彩虹爆炸图&#8221;。先上个图看看：<br /></p></div><div><img width="700" height="447" title="点击查看原始大小图片" alt="" src="http://dl2.iteye.com/upload/attachment/0108/7074/3a6dae85-202e-3f07-8fde-d3fea3852f47.png" /></div><br /><strong></strong><div><p>主要功能包括：</p><p>-可以通过json来定义数据和样式（类似百度的echarts那样）；<br /> -颜色可以固定，也可以自动彩虹色；<br /> -自动计算数值及角度占比；<br /> -动态显示导航路径；<br /> -鼠标动态高亮显示路径；<br /> -动画飞入、展开导航路径；<br /> -文字显示及角度控制；<br /> -全矢量，可鼠标缩放、平移，不失真；</p><p><br />下面重点码一下折腾过程中的几个重点：</p></div><strong></strong><div><h3><strong>一、定义节点对象</strong></h3><p>首先定义每一个小扇片节点。每个扇片可以用一段饼图来绘制。为了简单方便，这里用了最简单高效偷懒的方法：用一个半径很粗的线画一段角度的arc，即可。如下图：</p></div><div><img alt="" src="http://dl2.iteye.com/upload/attachment/0108/7076/0f1c62bf-a845-3814-8ccd-78303bef8aa7.png" /></div><div><p>另外还有文字等内容。所以定义它的json结构大概如下：</p><pre title=""  java;="" ;="" notranslate"=""><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">var&nbsp;item&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;{name:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">名称</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,&nbsp;color:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">red</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,&nbsp;angle:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">45</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,&nbsp;&#8230;};</span></div></pre><p>此外，下一圈的数据，可直接定义为这个节点的&#8220;孩子节点&#8221;，直接在item中定义一个data的子节点数据：</p><pre title=""  java;="" ;="" notranslate"=""><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">var&nbsp;item&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;{name:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">名称</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,&nbsp;color:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">red</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,&nbsp;angle:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">45</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,&nbsp;data:[<br />{name:&#8217;孩子一&#8217;,&nbsp;color:&#8217;green&#8217;,&#8230;},<br />{name:&#8217;孩子二&#8217;,&nbsp;color:&#8217;yellow&#8217;,&#8230;},<br />]};<br /></span></div><strong></strong><em></em><u></u><sub></sub><sup></sup><strike></strike><br /></pre><p>这样就可以组成一个树状结构。接下来要在canvas上绘制图形了。为了方便，这里直接使用了矢量图进行定义：</p><pre title=""  java;="" ;="" notranslate"=""><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">twaver.Util.registerImage(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">node</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,&nbsp;{<br />v:&nbsp;[{<br />shape:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">circle</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />r:&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />lineColor:&nbsp;function(data,view){</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;data.getClient(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">lineColor</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);},<br />lineWidth:&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />startAngle:&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />endAngle:&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />},{<br />shape:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">text</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />textBaseline:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">middle</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />textAlign:&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />text:&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />x:&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />y:&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />font:&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />fill:&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />rotate:&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />visible:&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />shadow:&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />}],<br />});<br /></span></div><strong></strong><em></em><u></u><sub></sub><sup></sup><strike></strike><br /><div>矢量图中定义了2个图形元素：一个arc弧线、一个文字对象，分别用于画node和绘制其文字。颜色、字体、是否可见、阴影、对齐、位置、线宽、角度&#8230;等等均在上面的定义中用一个function动态获取。例如，这个节点的半径，通过下面的方法，就可以在图形的lineColor属性中保存并驱动，需要修改，直接修改lineColor这个client属性即可，而不用去修改绘图参数，非常方便：</div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">r:function(data,view){</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;data.getClient(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">lineColor</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);}</span></div><strong></strong><em></em><u></u><sub></sub><sup></sup><strike></strike><br /><div><strong><br />二、文字控制</strong></div><br /><div>文字控制也比较啰嗦。首先是对齐方式。最简单的方式当然是让文字在所在扇片处，直接居中、旋转。这样文字会在径向的中间位置，如下图：</div><div><img alt="" src="http://dl2.iteye.com/upload/attachment/0108/7086/833c72bd-0f0e-307d-bea5-1bd6d79ed96c.png" /></div><br /></pre></div><strong></strong><div>但这样显示感觉并不是很完美。对于中文来说，如果能统一靠近圆心方向的位置对齐，会更好看一些。这样，即使文字过长，也会向外延伸，不会和里面的重叠。如下图：<br /><br /><div><img width="700" height="309" title="点击查看原始大小图片" alt="" src="http://dl2.iteye.com/upload/attachment/0108/7088/a05039b2-ddd8-3636-857a-4c9ee8cb6830.png" /></div><br /><div>还有，当文字在左半圆时，如果不做特殊处理，文字旋转会导致文字大头朝下，阅读起来有把脖子歪断的风险。所以应该动态判断，如果文字在左侧，应该文字再增加旋转180度。同时左侧的文字对齐也要特殊考虑，应该变成右对齐，才能保持径向的整齐一致。</div><br /><div><img alt="" src="http://dl2.iteye.com/upload/attachment/0108/7080/749363d6-9c9b-324a-8204-95f8248461d3.png" /></div><br /><div>文字还有一个细节就是颜色和阴影的问题。不使用阴影，单纯的使用颜色（例如白色），则在一些方向上的节点的文字会看不清楚，因为我们做的是彩虹爆炸图，各个方向颜色都不一样，而且还会随着圈数增加而变淡颜色，所以几乎不可能用一个固定的颜色（例如白色或黑色）能保证文字在所有地方都能和node颜色搭配并看清楚。所以思来想去还是使用了阴影效果。<br /><br /><div><img alt="" src="http://dl2.iteye.com/upload/attachment/0108/7084/8549ea35-805f-3ad9-abc9-7936287b88c8.png" /></div></div><strong></strong></div><strong></strong><div>联想了一下我们看美剧时候的字幕，似乎也是同样的问题。视频字幕要显示在千变万化的视频场景里面，视频场景的颜色完全随机出现无从知晓，要想让字幕看清楚，必然也会想一些办法解决。我们仔细观察一下视频字幕：</div><br /><div><img alt="" src="http://dl2.iteye.com/upload/attachment/0108/7092/0d9039a9-2ca9-3c43-b265-b7a59f88e9fc.png" /></div><br /><div>仔细观察，字幕是白色文字加了一圈黑色外框，这样就不怕任何场景了。我们在文字定义时也模拟一下，设置阴影和阴影偏移试一试：</div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">fill:</span><span style="color: #000000; ">'</span><span style="color: #000000; ">white</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />shadow:&nbsp;{<br />offsetX:&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">,<br />offsetY:&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">,<br />blur:&nbsp;</span><span style="color: #000000; ">4</span><span style="color: #000000; ">,<br />color:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">black</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />},<br /></span></div><br /><div>看一下使用前和使用后的效果对比：</div><br /><div><img alt="" src="http://dl2.iteye.com/upload/attachment/0108/7095/c1926dd0-5beb-30ae-8691-9d14dd2aeefe.png" /></div><br /><div>使用阴影后不但文字更清晰了，而且也增加了立体感，效果还是不错的。下面图显示应用在节点上的效果：</div><strong></strong><br /><div><img style="line-height: 1.5;" alt="" src="http://dl2.iteye.com/upload/attachment/0108/7097/63cbbfe7-a47a-36e4-b238-8c7023ba0b30.png" /></div><br /><div>可见不论什么颜色，都能比较好的勾勒出文字轮廓，保持清晰可读。</div><div><h3><strong>三、生成彩虹颜色</strong></h3><strong></strong><p><strong></strong></p><p>关于颜色，是一个有趣的话题。对于广大程序猿来说，颜色是一个既简单又困难的东西。我们随手就能写下&#8217;red&#8217;, &#8216;green&#8217;, &#8216;orange&#8217;, &#8216;yellow&#8217;这样的色彩斑斓的颜色，还能保证没有语法错误；我们还会写&#8217;#FF55AA&#8217;、&#8217;#0c0&#8217;、&#8217;RGB（0,204,0）&#8217;、&#8217; RGB（0％，80％，0％）&#8217;这样的各种颜色写法；我们也明白RGBA的含义和用途。但是，我们很少能把一个demo写的颜色很好看、很搭配。关于颜色和配色以后再专门讨论。这里我们只想自动生成一圈彩虹一样的颜色。用我们熟悉的RGB方法好像比较困难了。于是想起了那个HSV的颜色定义方法，它貌似很适合解决这个问题。<br /><br /></p></div><div><img alt="" src="http://dl2.iteye.com/upload/attachment/0108/7100/b54a30ec-3215-3e9d-8b65-d0aff414e9fe.png" /></div><strong></strong><br /><div><p>HSV颜色模型定义了色调H、饱和度S和亮度V，由A. R. Smith在1978年创建的一种颜色空间。其中H用一圈360度表示所有颜色，从红色开始按逆时针方向计算，红色为0度。饱和度S从0到1，越大越饱和。亮度V从0到255（也可以转换为从0到1，方便使用），越大越明亮，越小越暗淡。</p><p>Js里面并没有直接处理HSV颜色的函数。不过用下面的代码很方便可以从hsv转为rgb：<br /><br /></p></div><div><img alt="" src="http://dl2.iteye.com/upload/attachment/0108/7102/c4f24302-5df2-3896-82da-14281b46a9ff.png" /></div><strong></strong><br /><div>写一个对应的js函数也很简单：</div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;h,&nbsp;s,&nbsp;v&nbsp;(0&nbsp;~&nbsp;1)&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />function&nbsp;getHSVColor(h,&nbsp;s,&nbsp;v)&nbsp;{<br />var&nbsp;r,&nbsp;g,&nbsp;b,&nbsp;i,&nbsp;f,&nbsp;p,&nbsp;q,&nbsp;t;<br /></span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(h&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">amp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">amp;&nbsp;s&nbsp;</span><span style="color: #000000; ">===</span><span style="color: #000000; ">&nbsp;undefined&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">amp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">amp;&nbsp;v&nbsp;</span><span style="color: #000000; ">===</span><span style="color: #000000; ">&nbsp;undefined)&nbsp;{<br />s&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;h.s,&nbsp;v&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;h.v,&nbsp;h&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;h.h;<br />}<br />i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Math.floor(h&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">6</span><span style="color: #000000; ">);<br />f&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;h&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">6</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;i;<br />p&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;v&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;s);<br />q&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;v&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;f&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;s);<br />t&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;v&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;f)&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;s);<br /></span><span style="color: #0000FF; ">switch</span><span style="color: #000000; ">&nbsp;(i&nbsp;</span><span style="color: #000000; ">%</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">6</span><span style="color: #000000; ">)&nbsp;{<br /></span><span style="color: #0000FF; ">case</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">:&nbsp;r&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;v,&nbsp;g&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;t,&nbsp;b&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;p;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br /></span><span style="color: #0000FF; ">case</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">:&nbsp;r&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;q,&nbsp;g&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;v,&nbsp;b&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;p;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br /></span><span style="color: #0000FF; ">case</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">:&nbsp;r&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;p,&nbsp;g&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;v,&nbsp;b&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;t;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br /></span><span style="color: #0000FF; ">case</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">:&nbsp;r&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;p,&nbsp;g&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;q,&nbsp;b&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;v;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br /></span><span style="color: #0000FF; ">case</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">4</span><span style="color: #000000; ">:&nbsp;r&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;t,&nbsp;g&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;p,&nbsp;b&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;v;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br /></span><span style="color: #0000FF; ">case</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; ">:&nbsp;r&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;v,&nbsp;g&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;p,&nbsp;b&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;q;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br />}<br />var&nbsp;rgb</span><span style="color: #000000; ">=</span><span style="color: #000000; ">'</span><span style="color: #000000; ">#</span><span style="color: #000000; ">'</span><span style="color: #000000; ">+</span><span style="color: #000000; ">toHex(r&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">255</span><span style="color: #000000; ">)</span><span style="color: #000000; ">+</span><span style="color: #000000; ">toHex(g&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">255</span><span style="color: #000000; ">)</span><span style="color: #000000; ">+</span><span style="color: #000000; ">toHex(b&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">255</span><span style="color: #000000; ">);<br /></span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;rgb;<br />}<br /></span></div><br /><div>再回到我们的彩虹爆炸图。每一个节点对应的所在角度（中心角度）决定了它自己的颜色值。所以，我们可以直接根据这个角度得到颜色的h。然后，为了让彩虹逐渐一圈一圈变淡，再把s饱和度从1逐圈递减（例如0.1），产生变淡的效果。为了防止圈太多最后看不清，减到0.2到0.3左右可以停止递减。</div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">var&nbsp;fromAngle</span><span style="color: #000000; ">=</span><span style="color: #000000; ">node.getClient(&#8216;fromAngle&#8217;);<br />var&nbsp;toAngle</span><span style="color: #000000; ">=</span><span style="color: #000000; ">node.getClient(&#8216;toAngle&#8217;);<br />var&nbsp;level</span><span style="color: #000000; ">=</span><span style="color: #000000; ">node.getClient(&#8216;level&#8217;);</span><span style="color: #008000; ">//</span><span style="color: #008000; ">节点在第几圈</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">var&nbsp;h&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(fromAngle</span><span style="color: #000000; ">+</span><span style="color: #000000; ">to)</span><span style="color: #000000; ">/</span><span style="color: #000000; ">2</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">%</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">360</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">360</span><span style="color: #000000; ">;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">中心角度，并转换为弧度</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">var&nbsp;s&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Math.max(</span><span style="color: #000000; ">0.2</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">-</span><span style="color: #000000; ">level</span><span style="color: #000000; ">*</span><span style="color: #000000; ">0.1</span><span style="color: #000000; ">);</span><span style="color: #008000; ">//</span><span style="color: #008000; ">每圈s递减0.1，直到0.2为止</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">var&nbsp;v</span><span style="color: #000000; ">=</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />var&nbsp;color</span><span style="color: #000000; ">=</span><span style="color: #000000; ">getHSVColor(h,&nbsp;s,&nbsp;v);</span></div><br /><div>这样就获得了一圈颜色。实验效果如下：</div><br /><div><img alt="" src="http://dl2.iteye.com/upload/attachment/0108/7104/81268710-58e9-33fd-a8cf-5fb39697ebfd.png" /></div><div><br />如果相对某个节点的颜色做特殊处理，例如强制用橙色来凸显，我们可以在数据中定义时加个标记，设置颜色时候直接使用而不用计算即可。</div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">{name:</span><span style="color: #000000; ">'</span><span style="color: #000000; ">浦东新区</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,&nbsp;value:&nbsp;</span><span style="color: #000000; ">2600</span><span style="color: #000000; ">,&nbsp;color:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">#FE9A2E</span><span style="color: #000000; ">'</span><span style="color: #000000; ">}<br /></span></div><br /><br /><div><img alt="" src="http://dl2.iteye.com/upload/attachment/0108/7106/a564887d-55ad-3ecc-b33b-326a62f2d793.png" /></div><br /><div><p>接下来要实现鼠标划过节点，自动计算路径、高亮路径节点、暗淡非路径节点。为了方便路径寻找，程序把每个节点的下一圈子数据定义为子节点，子节点通过getParent()函数可以直接获得父对象。这样，通过不断getParent就可以获得整个路径上的节点，并修改其颜色为预设颜色，实现高亮效果：<br /><br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">var&nbsp;node</span><span style="color: #000000; ">=</span><span style="color: #000000; ">highlightedNode;<br /></span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(node){<br />node.setClient(&#8216;color&#8217;,&nbsp;node.getClient(&#8216;color.original&#8217;));<br />node</span><span style="color: #000000; ">=</span><span style="color: #000000; ">node.getParent();<br />}<br /></span></div><pre title=""  java;="" ;="" notranslate"=""></pre><p>对于非路径节点的颜色，可以设置为预设颜色但饱和度为0.1的淡颜色 ，让它变淡，以便突出高亮路径：</p></div><br /><strong></strong><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">var&nbsp;color&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;getHSVColor(h,&nbsp;</span><span style="color: #000000; ">0.1</span><span style="color: #000000; ">,&nbsp;v);<br />node.setClient(&#8216;color&#8217;,&nbsp;color);<br /></span></div><br /><div><strong>四、动画效果</strong><br /><br /><div>最后，为了图形更生动，使用了一些动画效果。首先想到的就是图形出来时候，用动画从小到大发散开来，会很动感。这样做需要用动画函数来驱动每一个节点的半径位置，从0增加到所在的半径位置，如果大家一起设置，整个图就会动起来。这里用了一个动画函数来驱动，并使用了网上常用的easing函数来控制，避免线性的动画太死板：</div><strong></strong></div><strong></strong><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Animate({<br />from:&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,<br />to:&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,<br />dur:&nbsp;</span><span style="color: #000000; ">3000</span><span style="color: #000000; ">+</span><span style="color: #000000; ">level</span><span style="color: #000000; ">*</span><span style="color: #000000; ">100</span><span style="color: #000000; ">,<br />easing:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">elasticOut</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />onUpdate:&nbsp;function&nbsp;(value)&nbsp;{<br />node.setLocation(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">pie.location&#8217;,&nbsp;value);</span><span style="color: #000000; "><br /></span><span style="color: #000000; ">},<br />}).play();<br /></span></div><br /><div><p>上面定义的动画，用3秒钟跑完，用&#8217;elasticOut&#8217;的easing方式。每一帧，修改node的位置信息。这样就完成了橡皮筋一样的环形弹出散开效果。</p><p>另外，导航条的出来也比较突兀，这里也使用一下动画，让它从左到右慢慢伸出：</p></div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Animate({<br />from:&nbsp;{x:x1,&nbsp;y:y1},<br />to:&nbsp;{x:x2,&nbsp;y:y2},<br />delay:</span><span style="color: #000000; ">50</span><span style="color: #000000; ">,<br />type:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">point</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />dur:&nbsp;</span><span style="color: #000000; ">1000</span><span style="color: #000000; ">,<br />easing:&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">bounceOut</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,<br />onUpdate:&nbsp;function&nbsp;(value)&nbsp;{<br />node.setCenterLocation(value.x,&nbsp;value.y);<br />},<br />}).play();<br /></span></div><br /><div>和上一个动画的不同之处在于这里使用了{x、y}的point结构，每一帧直接更新节点位置。同时设置了50毫秒的delay，让动画有一点点粘性停滞，不至于太突兀。效果不错。</div><br /><img width="672" height="363" alt="" src="http://www.blogjava.net/images/blogjava_net/twaver/dc0a3133-e830-38a6-a4a2-0c52225af536.png" border="0" /><br /><br /><div>至此，彩虹爆炸图基本上就做的差不多了。使用起来也很简单，只要准备一些json数据就可以了，下面是一些有趣的数据做出来的效果。感兴趣的同学可以联系我们索取代码。<br /><br /><img alt="" src="http://www.blogjava.net/images/blogjava_net/twaver/6a474a5b-26e6-39ab-af94-ecc7f160a377.png" border="0" /></div><br /><div>实际应用在项目中的示意图。</div><br /><img width="592" height="348" alt="" src="http://www.blogjava.net/images/blogjava_net/twaver/edf1191f-a6eb-3569-a09d-09fbe8719b42.png" border="0" /><br /><br /><div>如果您也希望在项目中用一下彩虹爆炸图，欢迎给我们发邮件索取：tw-service@servasoft.com</div><img src ="http://www.blogjava.net/TWaver/aggbug/431994.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TWaver/" target="_blank">TWaver</a> 2016-11-17 10:52 <a href="http://www.blogjava.net/TWaver/archive/2016/11/17/431994.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HTML5复杂拓扑图（五） Reingold Tilford树</title><link>http://www.blogjava.net/TWaver/archive/2015/05/22/425237.html</link><dc:creator>TWaver</dc:creator><author>TWaver</author><pubDate>Fri, 22 May 2015 09:37:00 GMT</pubDate><guid>http://www.blogjava.net/TWaver/archive/2015/05/22/425237.html</guid><wfw:comment>http://www.blogjava.net/TWaver/comments/425237.html</wfw:comment><comments>http://www.blogjava.net/TWaver/archive/2015/05/22/425237.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/TWaver/comments/commentRss/425237.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TWaver/services/trackbacks/425237.html</trackback:ping><description><![CDATA[前段时间，有个项目需要显示一个很大的树形拓扑结构图，而布局怎么都不好看。要生成一颗比较布局规矩、好看的树状图，一个成熟、高效的树形布局算法必不可少。Reingold Tilford是常用的一个，大家可以google一下。这个算法最先是由Edward Reingold和John Tilford一起发表的，并由他们的名字命名。有兴趣的同学，可以研究一下这篇1981年的论文：<a href="http://emr.cs.iit.edu/~reingold/tidier-drawings.pdf">http://emr.cs.iit.edu/~reingold/tidier-drawings.pdf</a>，里面给出了这个算法的原理和逻辑代码。这个算法的优点是逻辑相对简单，效率高。不过用js写一遍也要消耗很多脑细胞。还要，twaver直接提供了这种算法和自动布局，我们可以直接使用。
下面看一看这种布局的用途。利用Reingold Tilford树算法，我们可以把一个树形结构的数据，用不重叠、紧凑、分层的形式展示出来。最直接的用法就是直接生成一棵从左到右的树，如下图：
<img class="alignnone size-medium wp-image-9715" src="http://twaver.servasoft.com/wp-content/uploads/2015/05/HTML5拓扑树1-640x363.png" alt="HTML5拓扑树1" width="640" height="363" />
<br />图比较长，所以我们咔嚓了一刀，下面是后面一半的图：<br />
&nbsp;
&nbsp;
<img class="alignnone size-medium wp-image-9716" src="http://twaver.servasoft.com/wp-content/uploads/2015/05/HTML5拓扑树2-640x412.png" alt="HTML5拓扑树2" width="640" height="412" />
&nbsp;
<br />其实RT树也可以做各种变化。例如我们把纵向旋转成一圈进行排列，就会形成环形的RT树：
<br /><img class="alignnone size-medium wp-image-9717" src="http://twaver.servasoft.com/wp-content/uploads/2015/05/HTML5拓扑树3-516x480.png" alt="HTML5拓扑树3" width="516" height="480" />
<br />看到这些，我们可能会想起D3.js。D3也可以做出这些图形效果。相比之下，twaver使用起来会比较简单，两行代码就可以调用任意形状的自动布局算法：
<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">1</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">创建Autolayouter并绑定DataBox</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">2</span>&nbsp;<span style="color: #008000; "></span><br /><span style="color: #008080; ">3</span>&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;autoLayouter&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;twaver.layout.AutoLayouter(box);<br /><span style="color: #008080; ">4</span>&nbsp;<br /><span style="color: #008080; ">5</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">开始布局,参数分别为布局类型和回掉函数</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">6</span>&nbsp;<span style="color: #008000; "></span><br /><span style="color: #008080; ">7</span>&nbsp;autoLayouter.doLayout(type,callback);</div><br />另外，在实际项目使用中，数据往往需要多种形式进行展现，例如树、表格等配合拓扑图进行一体的、全方位的展示。这时twaver的优势就比较明显了。<br />下面这张图，数据通过右边的拓扑图和左边的树同时展示，甚至树上直接提供了勾选功能，选中后拓扑图也会跟着选中（深色阴影）。这种应用在twaver里面可以直接new一个Tree和Network，与同一个box关联即可。用D3估计还要其它的树组件并做交互同步，可能比较麻烦。
<br /><img class="alignnone size-medium wp-image-9718" src="http://twaver.servasoft.com/wp-content/uploads/2015/05/HTML5拓扑布局-640x364.png" alt="HTML5拓扑布局" width="640" height="364" />
&nbsp;
<br />不论哪种技术和产品，只要适合我们的使用需求就好。简单、轻量、好用，就是好产品。
<br />需要源代码的同学请与我们联系索取: info@servasoft.com<br /><br /><br /><img src ="http://www.blogjava.net/TWaver/aggbug/425237.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TWaver/" target="_blank">TWaver</a> 2015-05-22 17:37 <a href="http://www.blogjava.net/TWaver/archive/2015/05/22/425237.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HTML5复杂拓扑图（四） 组织结构图</title><link>http://www.blogjava.net/TWaver/archive/2015/05/22/425236.html</link><dc:creator>TWaver</dc:creator><author>TWaver</author><pubDate>Fri, 22 May 2015 09:33:00 GMT</pubDate><guid>http://www.blogjava.net/TWaver/archive/2015/05/22/425236.html</guid><wfw:comment>http://www.blogjava.net/TWaver/comments/425236.html</wfw:comment><comments>http://www.blogjava.net/TWaver/archive/2015/05/22/425236.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/TWaver/comments/commentRss/425236.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TWaver/services/trackbacks/425236.html</trackback:ping><description><![CDATA[应广大客户所需，今天给大家带来一款组织结构图。组织结构图的呈现方式多种多样，用途也是非常广泛，可以应用于集团内部，企业各部门之间的组织关系呈现。我们就来看看twaver实现出来的效果。
上下布局：
圆形布局：
这些布局用twaver来实现是非常的合适，实现起来也是很容易，twaver内部就提供了多种布局方式：自左向右，从下向上，具体可以看twaver的官方文档介绍。这里就不多说了，今天我们着重说一下twaver如果实现上图中的网元。先放大看看效果：
这里借用了女神的范冰冰头像。我们假设范冰冰为财务部出纳，我想范爷做为财务部主管也是当之无愧的，从刚开始的北漂到后来的一夜狂赚8千万。现在的社会，只要有钱投资了房产后半辈子就不用愁了，闲话不多扯。这里我们采用的是名片式的方式来呈现组织图上的每个网元，左侧一张图片，右侧是职称，这种矢量和位图的结合效果也是非常赞的。那么这种网元如何来实现呢？首先我们需要定义一个圆角矩形:
twaver.Util.registerImage('employee', { w: 200, h: 135, cache: false, origin: {x:0, y:0}, v: [{ shape: 'rect', w: '100%', h: '100%', r: 8, lineColor:'black', lineWidth:2.5, fill: '#F5ECCE', }], });

在圆角矩形的右侧放上文字：
{ shape: 'text', text: '<%=getClient("text")%>', font: '12px "Microsoft Yahei"', translate: {x:150,y:135/2}, } 
translate是将文字平移到指定的位置，这里我们需要放在右侧，因此需要设置偏右，x，y是相对于网元左上角原点来设置的。
接下来需要在左侧放置一个椭圆用于放组织节点的照片，这里的椭圆可以直接用path来描述 。
{ shape: 'path', data: 'M-45,-25Q-45,-64,0,-64Q45,-64,45,-25L45,25Q45,64,0,64Q-45,64,-45,25z', lineColor:'#BBBBBB', lineWidth:1, translate: {x: 60, y:135/2} }

data用于描述path的路径，这里面的M，Q，L分别代表moveto，quadraticCurveTo和lineto，比如M-45，就是移动到-45的位置上。具体的含义可以参考TWaver的官方文档。
接下来需要加上员工的图片，图片这里采用的是一般的位图，位图需要注册后才能使用。由于原始图片是方形的，需要裁减出圆角矩形的形状，说到裁减，twaver的矢量描述中支持clip，默认是不clip，设置clip之后，就会将超出矢量图片之外的区域的进行裁剪，可以用shape来描述裁减的区域，这里我们需要裁剪出圆角矩形，因此设置和上面矩形相同的path路径即可。
twaver.Util.registerImage('clip_pic', { w: 128, h: 128, cache: false, clip: { shape: 'path', data: 'M-45,-25Q-45,-64,0,-64Q45,-64,45,-25L45,25Q45,64,0,64Q-45,64,-45,25z', }, v: [{ shape: 'image', x:-64, y:-64, name: '<%=getClient("pic")%>', }], });

关于clip的更多使用，可以参考下面的文档：
html5-canvas-clipping-region-tutorial 
canvas-clip-image-in-a-circle
好了，一个组织结构图的网元就这样轻松实现。最后随机造一些数据可以看到整体效果了
想要具体demo的小伙伴，请发邮件至tw-service#servasoft.com，我们会将完整代码发送给您。
<img src ="http://www.blogjava.net/TWaver/aggbug/425236.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TWaver/" target="_blank">TWaver</a> 2015-05-22 17:33 <a href="http://www.blogjava.net/TWaver/archive/2015/05/22/425236.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HTML5复杂拓扑图（三） 可伸展流程图</title><link>http://www.blogjava.net/TWaver/archive/2015/05/22/425234.html</link><dc:creator>TWaver</dc:creator><author>TWaver</author><pubDate>Fri, 22 May 2015 09:29:00 GMT</pubDate><guid>http://www.blogjava.net/TWaver/archive/2015/05/22/425234.html</guid><wfw:comment>http://www.blogjava.net/TWaver/comments/425234.html</wfw:comment><comments>http://www.blogjava.net/TWaver/archive/2015/05/22/425234.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TWaver/comments/commentRss/425234.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TWaver/services/trackbacks/425234.html</trackback:ping><description><![CDATA[<h4>互联网购物成了当今非常热门的话题，各种购物网站，手机APP如雨后春笋般涌现出来。什么买衣服，买水果，买米，买油都得到了解决，自从有了这些app，再也不用去超市排着超长的队伍，扛着超重货物，骑着超累的车子了。之前每出一趟门买东西简直是跟参加了一场马拉松似的，现在好了，直接送货到家。那么在购物的背后又有什么样的流程呢，今天我们给大家介绍的是TWaver的另一款流程图。
说到TWaver的流程图却是层出不穷，千姿百态。2D的，3D的，静态的，动态的。这次要给大家呈现的是一款全矢量的，非常清新优美的流程图。先给大家看看效果：</h4>
<img class=" size-full wp-image-9572 aligncenter" src="http://twaver.servasoft.com/wp-content/uploads/2015/04/workflow.png" alt="workflow" width="484" height="615" />
<br /><h4>看到这样的图，是不是觉得不就是用了几张贴图嘛，如果这样想，那么你对twaver还是有所了解的。前面我们已经提到了，这是一款全矢量的流程图，这里可没有用到任何贴图哦，下面这些网元都是矢量描述出来的，缩放不失真。接下来我们就来介绍一下如何矢量描述这些网元呢？</h4>
<img class=" wp-image-9573 size-full aligncenter" src="http://twaver.servasoft.com/wp-content/uploads/2015/04/process-element.png" alt="process-element" width="128" height="111" />
<img class=" size-full wp-image-9576 aligncenter" src="http://twaver.servasoft.com/wp-content/uploads/2015/04/split-element.png" alt="split" width="151" height="71" />
<img class=" size-full wp-image-9574 aligncenter" src="http://twaver.servasoft.com/wp-content/uploads/2015/04/joint-element.png" alt="joint-element" width="74" height="79" />
<img class=" size-full wp-image-9575 aligncenter" src="http://twaver.servasoft.com/wp-content/uploads/2015/04/link-arrow.png" alt="link arrow" width="70" height="59" />
<br /><h4>这里我们以第一个为例，来介绍如何用矢量来描述这个元素，首先我们需要画一个圆角正方形，并且颜色是稍微带点渐变色，我们这里采用了线性渐变，中间是灰色，两边白色，代码如下：<br /><br />
</h4><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;twaver.Util.registerImage('process',&nbsp;{<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w:&nbsp;48,<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;h:&nbsp;42,<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lineWidth:1,<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lineColor:&nbsp;'#848484',<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v:&nbsp;[{<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shape:&nbsp;'rect',<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w:&nbsp;42,<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;h:&nbsp;36,<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x:&nbsp;-21,<br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y:&nbsp;-18,<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r:&nbsp;4,<br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gradient:&nbsp;{<br /><span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type:&nbsp;'linear',<br /><span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x1:&nbsp;0,<br /><span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y1:&nbsp;-25,<br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x2:&nbsp;0,<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y2:&nbsp;25,<br /><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stop:&nbsp;[{<br /><span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;offset:&nbsp;0,<br /><span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color:&nbsp;'white'<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},{<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;offset:&nbsp;0.4,<br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color:&nbsp;'#D8D8D8'<br /><span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},{<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;offset:&nbsp;1,<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color:&nbsp;'white'<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}]<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}]<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});</div><h4>看下运行后的效果：</h4><br />
<img class="  wp-image-9577 aligncenter" src="http://twaver.servasoft.com/wp-content/uploads/2015/04/QQ20150423-11.png" alt="vector" width="411" height="235" /><br />
<br /><h4>接着按照这种方式画中间的橙色小方块，一样的道理，也是中间画个圆角矩形，用了橙色的渐变：</h4><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><span style="color: #008080; ">&nbsp;1</span>&nbsp;{<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shape:&nbsp;'rect',<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w:&nbsp;36,<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;h:&nbsp;30,<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x:&nbsp;-18,<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y:&nbsp;-15,<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r:&nbsp;3,<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gradient:&nbsp;{<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type:&nbsp;'linear',<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x1:&nbsp;0,<br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y1:&nbsp;-20,<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x2:&nbsp;0,<br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y2:&nbsp;25,<br /><span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stop:&nbsp;[{<br /><span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;offset:&nbsp;0,<br /><span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color:&nbsp;'white'<br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},{<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;offset:&nbsp;0.4,<br /><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color:&nbsp;'#B45F04'<br /><span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},{<br /><span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;offset:&nbsp;1,<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color:&nbsp;'white'<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}]<br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</div><br /><img class="  wp-image-9578 aligncenter" src="http://twaver.servasoft.com/wp-content/uploads/2015/04/vector2.png" alt="vector image" width="360" height="176" />
<br /><br /><h4>最后就是中间几条线了，可以采用path来描述，自己画出每个像素点，代码如下：</h4><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><span style="color: #008080; ">1</span>&nbsp;{<br /><span style="color: #008080; ">2</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shape:&nbsp;'path',<br /><span style="color: #008080; ">3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data:&nbsp;'M-12,-8l4,0m2,0l12,0M-9,-3l4,0m2,0l12,0M-6,2l4,0m2,0l12,0M-9,7l4,0m2,0l12,0',<br /><span style="color: #008080; ">4</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lineWidth:&nbsp;1.5,<br /><span style="color: #008080; ">5</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lineColor:&nbsp;'#F2F2F2',<br /><span style="color: #008080; ">6</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</div><br /><h4>写到这里，你会不会觉得怎么现在弄个矢量的图片这么复杂，像素啥的还要自己来算。如果什么都自己干，那么自己是不是也可以当美工了。哈哈哈，如果你觉得可以，一些简单的美工活是不用求别人了，自己也能干。但是如果你觉得复杂，也可以直接用美工提供的svg图片，通过twaver的转换器直接转换出上面的这些代码。
矢量图片先讲到这里，我们再来看link上是如何画出一个箭头的，就是下面的这种效果：</h4>
<img class="  wp-image-9579 aligncenter" src="http://twaver.servasoft.com/wp-content/uploads/2015/04/QQ20150423-1.png" alt="link arrow" width="443" height="345" />
<br /><br /><h4>这里我们用到了link的icon附件，link上icon的附件也可以用矢量哦，是不是很赞：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">1</span>&nbsp;link.setStyle('icons.names',&nbsp;['link_arrow']);</div>
</h4><h4>这里的'link_arrow'就是我们注册的矢量图片名称。
加了连线的矢量，连线的走向也需要自己定义一下。这里通过linkpath来定义,network上提供了设置linkpath的方法：
</h4><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">1</span>&nbsp;network.setLinkPathFunction(createLinkPath);</div><h4>连线的走向我们这里采用了先水平后垂直的方式，也可以加上水平的偏移的值，这样我们可以控制连线的拐点。</h4>
<img class="  wp-image-9580 aligncenter" src="http://twaver.servasoft.com/wp-content/uploads/2015/04/QQ20150423-3.png" alt="link path" width="461" height="288" />
<br /><strong><br />双击展开，合并动画</strong>
<br /><h4>这款流程图，最大的特点是可以合并展开子流程，并可以指定合并时收起哪些点，合并后的效果如下：</h4>
<img class=" size-full wp-image-9593 aligncenter" src="http://twaver.servasoft.com/wp-content/uploads/2015/04/QQ20150424-1.png" alt="collapse workflow" width="461" height="431" />
<br /><h4>这样流程图就会清晰很多，如果不想看中间复杂的子流程合并起来就可以了。
这里的我们录制了一个视频供大家欣赏：
<embed src="http://player.youku.com/player.php/Type/Folder/Fid/23725124/Ob/1/sid/XOTQwODMzMjky/v.swf" type="application/x-shockwave-flash" width="480" height="400" align="center"></embed>
&nbsp;
</h4><h4>感兴趣的朋友可以发邮件到tw-service#servasoft.com，我们会将完整代码呈现给您。</h4><img src ="http://www.blogjava.net/TWaver/aggbug/425234.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TWaver/" target="_blank">TWaver</a> 2015-05-22 17:29 <a href="http://www.blogjava.net/TWaver/archive/2015/05/22/425234.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HTML5复杂拓扑图（二） 关系网图</title><link>http://www.blogjava.net/TWaver/archive/2015/05/22/425232.html</link><dc:creator>TWaver</dc:creator><author>TWaver</author><pubDate>Fri, 22 May 2015 09:06:00 GMT</pubDate><guid>http://www.blogjava.net/TWaver/archive/2015/05/22/425232.html</guid><wfw:comment>http://www.blogjava.net/TWaver/comments/425232.html</wfw:comment><comments>http://www.blogjava.net/TWaver/archive/2015/05/22/425232.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TWaver/comments/commentRss/425232.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TWaver/services/trackbacks/425232.html</trackback:ping><description><![CDATA[<h3>关系网图的呈现方式多种多样，今天我们给大家分享的是和弦式的关系网图，先来看看效果：
<img class="aligncenter size-full wp-image-9546" src="http://twaver.servasoft.com/wp-content/uploads/2015/04/chord-1.png" alt="chord-1" width="708" height="574" />
</h3><h4>例子中我们展示的是各部门员工之间的复杂关系图。在公司内部，不仅部门内部员工之间发生着关系往来，部门和部门之间的员工也在发生这各种往来关系。如果你还是用原先的那种表格来呈现，显然很难直观看出各种关系，用图形化的拓扑呈现就会显得一目了然。好了，我们就来分析一下这张图如何用twaver实现它。</h4><h3>
首先我们要定义部门的网元，twaver矢量减少了我们很多定制UI的繁琐，我们直接用矢量来描述这个小圆点部分，注意小圆点的颜色需要区分鼠标滑过时的效果，这里我们定义了是否需要高亮的属性：highlighted，代码如下：</h3><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><span style="color: #008080; ">&nbsp;1</span>&nbsp;twaver.Util.registerImage('circle_node',&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w:&nbsp;200,<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;h:&nbsp;200,<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lineWidth:1,<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lineColor:&nbsp;'black',&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v:&nbsp;[{<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shape:&nbsp;'circle',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r:&nbsp;6,<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fill:&nbsp;<span style="color: #0000FF; ">function</span>(data,&nbsp;view){<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(data.getClient('highlighted')){<br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;highlightedNodeColor;<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<span style="color: #0000FF; ">else</span>{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;normalNodeColor;<br /><span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}]<br /><span style="color: #008080; ">17</span>&nbsp;});</div><h3>第一步，小圆点描述好了，接下来就需要为圆点加上文字的显示，文字如果按照默认的显示方式显然不太好，因为我们是要让文字进行旋转，而文字所处的位置需要根据角度来计算对其方式和偏移值，当然文字也需要鼠标滑过的效果：</h3><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;[code]<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;{<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shape:&nbsp;'text',<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text:&nbsp;'&lt;%=getClient("text")%&gt;',<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;textAlign:&nbsp;<span style="color: #0000FF; ">function</span>(data,&nbsp;view){<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;angle=data.getClient('angle'&nbsp;&nbsp;&nbsp;&nbsp;)+ball.angle;<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;angle=angle%360;<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(angle&lt;0){<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;angle=angle+360;<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(angle&gt;90&nbsp;&amp;&amp;&nbsp;angle&lt;270){<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;'right';<br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;'left';<br /><span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br /><span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;textBaseline:&nbsp;'middle',<br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font:&nbsp;'12px&nbsp;"Microsoft&nbsp;Yahei"',<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fill:&nbsp;<span style="color: #0000FF; ">function</span>(data,&nbsp;view){<br /><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(data.getClient('highlighted')){<br /><span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;highlightedNodeColor;<br /><span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<span style="color: #0000FF; ">else</span>{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;'black';<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br /><span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x:&nbsp;<span style="color: #0000FF; ">function</span>(data,&nbsp;view){<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;angle=data.getClient('angle'&nbsp;&nbsp;&nbsp;&nbsp;)+ball.angle;<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;angle=angle%360;<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(angle&lt;0){<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;angle=angle+360;<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(angle&gt;90&nbsp;&amp;&amp;&nbsp;angle&lt;270){<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;-10<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;10;<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">36</span>&nbsp;}</div><h3>好了，第三步需要让整个节点能旋转起来，因此我们还需要为node加上旋转的矢量描述：
</h3><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;rotate:&nbsp;<span style="color: #0000FF; ">function</span>(data,&nbsp;view){<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;angle=data.getClient('angle')+ball.angle;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;angle=angle%360;<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(angle&lt;0){<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;angle=angle+360;<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(angle&gt;90&nbsp;&amp;&amp;&nbsp;angle&lt;270){<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;angle+=180;<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;angle;<br /><span style="color: #008080; ">11</span>&nbsp;}</div><h3>至此部门的节点就定制好了，是不是感觉复杂了一下，没关系，如果想要这样的功能，直接使用我们封装好的这个就可以了。
接着我们还需要来定制连线，上图中连线走向的那种方式在twaver产品中已经是很常见了，这里我们就不多描述了。
OK，准备好节点和连线的矢量描述之后就可以来填充数据了，创建好公司的所有部门以及员工之间的关系后，我们还需要给部门设置上旋转的度数：</h3><size;i++){ var="" angle="Math.PI*2/size*i;" x="ball.cx+ball.width*Math.cos(angle);" y="ball.cy+ball.height*Math.sin(angle);" id="n"  +i;="" degree="parseInt(angle/Math.PI*180);" node="createNode(box,"  id,="" x,="" y,="" '部门'+i,="" degree);="" }="" [="" code]="" 这样我们上面的那张图的功能就差不多了。也许有人会觉得怎么都是呈现的是部门，如何才能看到部门下哪些员工和另外的部门有关系呢。是的，到此我们还只完成了一半，还有更精彩的内容呈现给大家。="" 双击部门后，可以展开这个部门，并显示部门下所有的员工。="" <="" img="" class="aligncenter size-full wp-image-9552" src="http://twaver.servasoft.com/wp-content/uploads/2015/04/chord-2.png" alt="chord-2" width="853" height="582"><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">1</span>&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">var</span>&nbsp;i=0;i&lt;size;i++){<br /><span style="color: #008080; ">2</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;angle=Math.PI*2/size*i;<br /><span style="color: #008080; ">3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;x=ball.cx+ball.width*Math.cos(angle);<br /><span style="color: #008080; ">4</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;y=ball.cy+ball.height*Math.sin(angle);<br /><span style="color: #008080; ">5</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;id='n'+i;<br /><span style="color: #008080; ">6</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;degree=parseInt(angle/Math.PI*180);<br /><span style="color: #008080; ">7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;node=createNode(box,&nbsp;id,&nbsp;x,&nbsp;y,&nbsp;'部门'+i,&nbsp;degree);<br /><span style="color: #008080; ">8</span>&nbsp;}</div><br /><h3>这样我们上面的那张图的功能就差不多了。也许有人会觉得怎么都是呈现的是部门，如何才能看到部门下哪些员工和另外的部门有关系呢。是的，到此我们还只完成了一半，还有更精彩的内容呈现给大家。</h3><h3>双击部门后，可以展开这个部门，并显示部门下所有的员工。</h3><div><img src="http://twaver.servasoft.com/wp-content/uploads/2015/04/chord-2.png" width="853" height="582" alt="" /></div></size;i++){><h3><size;i++){ var="" angle="Math.PI*2/size*i;" x="ball.cx+ball.width*Math.cos(angle);" y="ball.cy+ball.height*Math.sin(angle);"  +i;="" degree="parseInt(angle/Math.PI*180);" node="createNode(box,"  id,="" x,="" y,="" '部门'+i,="" degree);="" }="" [="" code]="" 这样我们上面的那张图的功能就差不多了。也许有人会觉得怎么都是呈现的是部门，如何才能看到部门下哪些员工和另外的部门有关系呢。是的，到此我们还只完成了一半，还有更精彩的内容呈现给大家。="" 双击部门后，可以展开这个部门，并显示部门下所有的员工。="" <="" img="" class="aligncenter size-full wp-image-9552" src="http://twaver.servasoft.com/wp-content/uploads/2015/04/chord-2.png" alt="chord-2" width="853" height="582">是不是很帅，注意这里是有动画效果的，双击某个部门，这个部门会转到顶部，然后展开这个部门。这个用twaver新增的动画功能很容易来实现，这里就不多说了。下面录制了一个视频供大家欣赏。这样我们就能更清楚的知道这个部门下的员工和哪个部门下的员工有业务往来关系了。下图是一个gif图片，下载有点慢，请耐心等待。
</size;i++){></h3><size;i++){ var="" angle="Math.PI*2/size*i;" x="ball.cx+ball.width*Math.cos(angle);" y="ball.cy+ball.height*Math.sin(angle);"  +i;="" degree="parseInt(angle/Math.PI*180);" node="createNode(box,"  id,="" x,="" y,="" '部门'+i,="" degree);="" }="" [="" code]="" 这样我们上面的那张图的功能就差不多了。也许有人会觉得怎么都是呈现的是部门，如何才能看到部门下哪些员工和另外的部门有关系呢。是的，到此我们还只完成了一半，还有更精彩的内容呈现给大家。="" 双击部门后，可以展开这个部门，并显示部门下所有的员工。="" <="" img="" class="aligncenter size-full wp-image-9552" src="http://twaver.servasoft.com/wp-content/uploads/2015/04/chord-2.png" alt="chord-2" width="853" height="582"><br /><img class="alignleft size-full wp-image-9555" src="http://twaver.servasoft.com/wp-content/uploads/2015/04/chord.gif" alt="chord" width="876" height="613" />
<br /><br /></size;i++){><h3><size;i++){ var="" angle="Math.PI*2/size*i;" x="ball.cx+ball.width*Math.cos(angle);" y="ball.cy+ball.height*Math.sin(angle);"  +i;="" degree="parseInt(angle/Math.PI*180);" node="createNode(box,"  id,="" x,="" y,="" '部门'+i,="" degree);="" }="" [="" code]="" 这样我们上面的那张图的功能就差不多了。也许有人会觉得怎么都是呈现的是部门，如何才能看到部门下哪些员工和另外的部门有关系呢。是的，到此我们还只完成了一半，还有更精彩的内容呈现给大家。="" 双击部门后，可以展开这个部门，并显示部门下所有的员工。="" <="" img="" class="aligncenter size-full wp-image-9552" src="http://twaver.servasoft.com/wp-content/uploads/2015/04/chord-2.png" alt="chord-2" width="853" height="582">或者直接点击看视频：</size;i++){></h3><size;i++){ var="" angle="Math.PI*2/size*i;" x="ball.cx+ball.width*Math.cos(angle);" y="ball.cy+ball.height*Math.sin(angle);"  +i;="" degree="parseInt(angle/Math.PI*180);" node="createNode(box,"  id,="" x,="" y,="" '部门'+i,="" degree);="" }="" [="" code]="" 这样我们上面的那张图的功能就差不多了。也许有人会觉得怎么都是呈现的是部门，如何才能看到部门下哪些员工和另外的部门有关系呢。是的，到此我们还只完成了一半，还有更精彩的内容呈现给大家。="" 双击部门后，可以展开这个部门，并显示部门下所有的员工。="" <="" img="" class="aligncenter size-full wp-image-9552" src="http://twaver.servasoft.com/wp-content/uploads/2015/04/chord-2.png" alt="chord-2" width="853" height="582">
<iframe height="600" width="800" src="http://player.youku.com/embed/XOTM2MzE1ODE2" frameborder="0" allowfullscreen=""></iframe>
<br /><br />想要demo的小伙伴们，给我们发邮件吧，我们会将完整代码呈现给您。
 </size;i++){><img src ="http://www.blogjava.net/TWaver/aggbug/425232.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TWaver/" target="_blank">TWaver</a> 2015-05-22 17:06 <a href="http://www.blogjava.net/TWaver/archive/2015/05/22/425232.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>