成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

基于HTML5實現(xiàn)的Heatmap熱圖3D應(yīng)用

開發(fā) 前端
實現(xiàn)Heatmap的開源js庫比較出名的就是 heatmapjs ,該框架發(fā)展了2年多,作者Patrick Wied最近決定在保持開源的基礎(chǔ)上,提供有償?shù)纳虡I(yè)支持服務(wù),這是好事,地球上絕大部分開源項目作者搞個barely可用的初級版本后,就多年不見更新了,而真正能實際上線使用的產(chǎn)品哪有不需要持續(xù)完善、增強可擴展性以及提供特殊定制服務(wù)的,考慮到作者這兩年已無償投了這么多(Over the last 2 years, I devoted more than 500 hours of work to improving heatmap.js to make it a truly great l...

Heatmap熱圖通過眾多數(shù)據(jù)點信息,匯聚成直觀可視化顏色效果,熱圖已廣泛被應(yīng)用于氣象預(yù)報、醫(yī)療成像、機房溫度監(jiān)控等行業(yè),甚至應(yīng)用于競技體育領(lǐng)域的數(shù)據(jù)分析。

Viz Libero heat map

已有眾多文章分享了生成Heatmap熱圖原理,可參考《How to make heat maps》和《How to make heat maps in Flex》,本文將介紹基于HTML5技術(shù)的實現(xiàn)方式,主要基于Cavans和WebGL這兩種HTML5的2D和3D技術(shù)的應(yīng)用,先上最終例子實現(xiàn)的界面效果和操作視頻

IMG_1036

實現(xiàn)Heatmap的開源js庫比較出名的就是 heatmapjs ,該框架發(fā)展了2年多,作者Patrick Wied最近決定在保持開源的基礎(chǔ)上,提供有償?shù)纳虡I(yè)支持服務(wù),這是好事,地球上絕大部分開源項目作者搞個barely可用的初級版本后,就多年不見更新了,而真正能實際上線使用的產(chǎn)品哪有不需要持續(xù)完善、增強可擴展性以及提供特殊定制服務(wù)的,考慮到作者這兩年已無償投了這么多(Over the last 2 years, I devoted more than 500 hours of work to improving heatmap.js to make it a truly great library. ),希望此文也能幫作者在國內(nèi)起點宣傳作用。

heatmapjs 采用的Canvas的2D繪制方式實現(xiàn),這種基于CPU的繪制方式對于幾百幾千的點還湊合,但如果需要實時運算成千上萬節(jié)點效果的,還是得依靠并發(fā)性更強大的GPU方式,采用HTML5的話只能是WebGL方案,還好Florian Boesch在《High Performance JS heatmaps》博客中提供了基于WebGL實現(xiàn)的heatmap方式,并將其開源在https://github.com/pyalot/webgl-heatmap  上,這兩個開源庫質(zhì)量都還不錯,一個基于Canvas實現(xiàn),一個基于WebGL實現(xiàn),后者性能高點,但需要支持WebGL的瀏覽器,heatmapjs 的文檔例子比較全面,但兩者接口都非常簡單易學(xué),代碼也都就幾百行,你完全可以根據(jù)項目情況選擇甚至進行代碼改造優(yōu)化。

回到我們要實現(xiàn)的例子,我將采用heatmapjs在內(nèi)存中實時運算出熱圖,結(jié)合hightopoHT for Web的3D引擎,以一堆節(jié)點連線關(guān)系的3D的網(wǎng)絡(luò)拓?fù)鋱D,其中節(jié)點代表熱源,其越接近地面則地面溫度越高,這樣每個節(jié)點的xz面坐標(biāo)信息作為要傳入給heatmapjs的點xy二維坐標(biāo)信息,三維節(jié)點的elevation也就是y軸信息,則作為離地面的距離信息,距離越大轉(zhuǎn)成要傳入heatmapjs的value值越小,***啟動HT for Web的三維拓?fù)渥詣硬季謴椓λ惴ǎ@樣可直觀的觀察圖元節(jié)點在不同的空間位置動態(tài)變化時地板的溫度熱圖變化效果。

代碼核心就在重載forceLayout.onRelaxed函數(shù),在每次自動布局過程將所有熱源節(jié)點的信息構(gòu)建成heatmap需要的數(shù)據(jù),同時通過ht.Default.setImage(‘hm-bottom’, heatmap._renderer.canvas);將熱圖的canvas注冊成HT的圖片,而floor的地板圖元綁定了注冊的’hm-bottom’圖片,這樣就實現(xiàn)了內(nèi)存繪制canvas,然后通過HT for Web的3D引擎將Cavnas作為貼圖信息動態(tài)呈現(xiàn)到3D場景的效果。

整個實現(xiàn)代碼如下不到百行,你也可以采用https://github.com/pyalot/webgl-heatmap 的WebGL方式來實現(xiàn),這樣就是3D到2D再到3D的有趣過程,這就是HTML5技術(shù)可無縫融合各種方案的魅力!

  1. MAX = 500;  
  2. WIDTH = 1024;  
  3. HEIGHT = 512;          
  4. function init() {                             
  5.     dataModel = new ht.DataModel();              
  6.     g3d = new ht.graph3d.Graph3dView(dataModel);                              
  7.     g3d.getMoveMode = function(e){ return 'xyz'; };                          
  8.     view = g3d.getView();              
  9.     view.className = 'main';  
  10.     document.body.appendChild(view);      
  11.     window.addEventListener('resize'function (e) { g3d.invalidate(); }, false);              
  12.     heatmap = h337.create({ width: WIDTH, height: HEIGHT });                                     
  13.     ht.Default.setImage('hm-bottom', heatmap._renderer.canvas);              
  14.     var floor = new ht.Node();  
  15.     floor.s3(WIDTH, 1, HEIGHT);  
  16.     floor.s({  
  17.         '3d.selectable'false,  
  18.         'layoutable'false,  
  19.         'all.visible'false,  
  20.         'top.visible'true,  
  21.         'top.image''hm-bottom',  
  22.         'top.reverse.flip'true,  
  23.         'bottom.visible'true,  
  24.         'bottom.transparent'true,  
  25.         'bottom.opacity': 0.5,  
  26.         'bottom.reverse.flip'true                  
  27.     });  
  28.     dataModel.add(floor);              
  29.     var root = createNode();                     
  30.     for (var i = 0; i < 3; i++) {  
  31.         var iNode = createNode();                         
  32.         createEdge(root, iNode);  
  33.         for (var j = 0; j < 3; j++) {  
  34.             var jNode = createNode();                              
  35.             createEdge(iNode, jNode);                                                           
  36.         }  
  37.     }                     
  38.     forceLayout = new ht.layout.Force3dLayout(g3d);    
  39.     forceLayout.start();  
  40.     forceLayout.onRelaxed = function(){  
  41.         var points = [];  
  42.         dataModel.each(function(data){  
  43.             if(data instanceof ht.Node && data !== floor){  
  44.                 var p3 = data.p3();  
  45.                 if(p3[1] > MAX){  
  46.                     p3[1] = MAX;  
  47.                     data.setElevation(MAX);  
  48.                 }  
  49.                 else if(p3[1] < -MAX){  
  50.                     p3[1] = -MAX;  
  51.                     data.setElevation(-MAX);  
  52.                 }                          
  53.                 points.push({  
  54.                     x: p3[0] + WIDTH/2,  
  55.                     y: p3[2] + HEIGHT/2,  
  56.                     value: MAX - Math.abs(p3[1])  
  57.                 });  
  58.             }  
  59.         });  
  60.         heatmap.setData({data: points, min: 0, max: MAX});  
  61.     };  
  62. }  
  63. function createNode(){  
  64.     var node = new ht.Node();               
  65.     node.s({  
  66.         'shape3d''sphere',  
  67.         'shape3d.color''#E74C3C',  
  68.         'shape3d.opacity': 0.8,  
  69.         'shape3d.transparent'true,  
  70.         'shape3d.reverse.cull'true 
  71.     });  
  72.     node.s3(20, 20, 20);  
  73.     dataModel.add(node);  
  74.     return node;  
  75. }  
  76. function createEdge(sourceNode, targetNode){  
  77.     var edge = new ht.Edge(sourceNode, targetNode);  
  78.     edge.s({  
  79.         'edge.width': 3,  
  80.         'edge.offset': 10,                  
  81.         'shape3d''cylinder',  
  82.         'shape3d.opacity': 0.7,  
  83.         'shape3d.transparent'true,  
  84.         'shape3d.reverse.cull'true 
  85.     });  
  86.     dataModel.add(edge);  
  87.     return edge;  

本文來自:http://my.oschina.net/xhload3d/blog/312648

責(zé)任編輯:林師授 來源: xhload3d的博客
相關(guān)推薦

2014-02-24 11:43:44

HTML5機房監(jiān)控

2015-10-08 08:48:37

HTML53D網(wǎng)絡(luò)拓?fù)錁?/a>

2012-02-27 10:00:50

HTML 5

2015-06-26 11:51:26

HTML5JavaScript

2022-09-19 19:16:42

輪播圖has

2009-12-14 08:58:25

HTML5網(wǎng)頁3DWebGL

2015-12-07 09:05:37

HTML5動畫源碼

2012-04-24 15:07:49

HTML5

2024-12-23 15:46:59

2024-07-16 12:02:11

2012-06-16 16:57:52

WebGL

2012-09-19 15:21:48

Worklight

2011-05-11 12:59:18

HTML5

2011-09-22 10:07:52

奧圖碼投影儀

2011-12-21 12:46:43

2012-01-04 00:10:52

ibmdw

2011-05-26 10:55:39

2011-08-01 16:43:51

ibmdwHTML5Dojo

2016-10-09 09:57:41

Html5拓?fù)鋱D3D

2013-05-31 15:48:44

Atheer增強現(xiàn)實D11
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 一区二区不卡高清 | 日韩成人在线播放 | 欧美日本高清 | 久久成人精品视频 | 99久9| 亚洲在线久久 | 激情网站 | 亚洲国产精品99久久久久久久久 | 日本在线播放一区二区 | 天天久久 | 午夜精品一区二区三区在线视 | 精品视频久久久 | 日本欧美在线视频 | 美女国产一区 | 麻豆av网| 国产精品无码永久免费888 | 欧美精品一区二区在线观看 | 99国产精品久久久久老师 | 国产精品 欧美精品 | 久久爱综合 | 91精品国产91久久综合桃花 | 久久er精品 | 成人免费小视频 | 精品一区久久 | 懂色av一区二区三区在线播放 | 一区二区三区视频在线免费观看 | 亚洲网站在线观看 | 操操日| 一级大片免费 | 欧美成人第一页 | 在线观看av网站 | 国产线视频精品免费观看视频 | 亚洲一区二区三区欧美 | 日韩精品久久一区二区三区 | 亚洲a视| 欧美日产国产成人免费图片 | 日产精品久久久一区二区福利 | 综合网视频| 婷婷丁香激情 | 国产一级特黄真人毛片 | 91精品国产综合久久福利软件 |