摘要:上圖是布局的計(jì)算模型。刪除方法刪除的只是布局保存的數(shù)據(jù),然后重繪畫(huà)面,如果你需要畫(huà)面平滑改變,修改繪圖實(shí)現(xiàn)方法即可,這里不再贅述。
作者:心葉
時(shí)間:2018-11-06 14:47
clay項(xiàng)目Github地址:https://github.com/yelloxing/...
喜歡本項(xiàng)目的可以在github上給給star。
在繪制一些常見(jiàn)圖形的時(shí)候,比如關(guān)系圖,單個(gè)結(jié)點(diǎn)或連線并不難,麻煩的是位置的計(jì)算等,和圖形模塊不同,布局就是專門計(jì)算一些特殊圖形位置的模塊,用一句通俗的話說(shuō)就是:決定什么元素繪制在哪里。因此,布局應(yīng)該和具體的繪圖方法無(wú)關(guān),她只關(guān)心位置的計(jì)算。
下面,我們將通過(guò)介紹一個(gè)最簡(jiǎn)單的樹(shù)圖的繪制過(guò)程來(lái)說(shuō)明布局的設(shè)計(jì)理念,讓我們開(kāi)始吧!
繪制圖形$$("").appendTo("body") .attr("width", "400") .attr("height", "400");
上圖是最終運(yùn)行結(jié)果,上面我們準(zhǔn)備好了畫(huà)布,需要繪圖的原始數(shù)據(jù)如下:
var nodes = [ // 結(jié)點(diǎn)名稱、父節(jié)點(diǎn)名稱 ["手繪", null], ["水粉", "手繪"], ["油畫(huà)", "手繪"], ["素描", "手繪"], ["中國(guó)畫(huà)", "手繪"], ["空間透視", "素描"], ["色彩五大調(diào)", "素描"], ];
使用布局繪圖的第一步是創(chuàng)建布局對(duì)象,這里是創(chuàng)建tree布局對(duì)象:
// 創(chuàng)建布局對(duì)象 var tree = clay.treeLayout();
理論上來(lái)說(shuō),原始數(shù)據(jù)可以是任意格式,只要保證整體是一個(gè)數(shù)組即可。這主要是考慮到實(shí)際開(kāi)發(fā)復(fù)雜的環(huán)境,因此,提供了數(shù)據(jù)格式配置接口,對(duì)于上面的數(shù)據(jù),進(jìn)行如下配置:
tree // 獲取根結(jié)點(diǎn) .root(function (initTree) { return initTree[0]; }) // 獲取孩子結(jié)點(diǎn) .child(function (parentTree, initTree) { var children = [], i; for (i = 0; i < nodes.length; i++) { if (initTree[i][2] == parentTree[0]) children.push(initTree[i]); } return children; }) // 獲取結(jié)點(diǎn)標(biāo)志id .id(function (treedata) { return treedata[0]; })
不同布局需要配置的項(xiàng)不一樣,對(duì)于tree布局而言,關(guān)于數(shù)據(jù)結(jié)構(gòu)的部分,只需要告訴她如何根據(jù)父結(jié)點(diǎn)獲取子結(jié)點(diǎn),一個(gè)結(jié)點(diǎn)的唯一標(biāo)識(shí)怎么確定,根節(jié)點(diǎn)是誰(shuí)。
開(kāi)頭就說(shuō)明的很清楚了,布局應(yīng)該是和具體繪圖方式無(wú)關(guān)的存在,因此,這里我們選擇了svg繪圖,就需要再配置一下具體的繪圖方法。
tree.drawer(function (nodes, rootid, size) { var i, node; for (i in nodes) { node = nodes[i]; // 繪制結(jié)點(diǎn) $$("") .appendTo(".node") .attr("cx", node.left * 100) .attr("cy", node.top * 100); // 繪制文字 $$(" " + node.data[0] + " ") .appendTo(".text") .attr("x", node.left * 100) .attr("y", (node.top * 100 - 14)); // 繪制連線 if (node.pid) $$("") .appendTo(".line") .attr("d", "M" + nodes[node.pid].left * 100 + " " + nodes[node.pid].top * 100 + "C" + (nodes[node.pid].left * 100 + 50) + "," + nodes[node.pid].top * 100 + " " + (node.left * 100 - 50) + "," + node.top * 100 + " " + node.left * 100 + "," + node.top * 100 + " "); } });
到這里,所有必須的配置都寫(xiě)好了,添加下面這行代碼,啟動(dòng)繪圖:
tree(nodes);
至此,運(yùn)行代碼就可以看見(jiàn)一棵記錄著結(jié)點(diǎn)關(guān)系的樹(shù)圖了,繪圖結(jié)束!
計(jì)算模型因?yàn)椴季植粫?huì)知道最終繪制的圖形具體是什么樣子,比如這里的樹(shù)布局,也許你想繪制的是旋轉(zhuǎn)的樹(shù)或倒樹(shù),也可能你就是想要和這里一樣的簡(jiǎn)單樹(shù)。為了防止問(wèn)題復(fù)雜化,布局在計(jì)算位置的時(shí)候,都會(huì)統(tǒng)一選擇一種最樸素的場(chǎng)景作為計(jì)算模型,從該模型出發(fā),任何別的模型借助clay提供的一些計(jì)算方法實(shí)現(xiàn)起來(lái)就很容易了。
上圖是tree布局的計(jì)算模型。右邊的每個(gè)紅色矩形都是一個(gè)1x1的正方形,坐標(biāo)原心位于左上角綠色頂點(diǎn)。
配置具體繪圖方式的時(shí)候,其中第一個(gè)參數(shù)nodes就記錄了每個(gè)結(jié)點(diǎn)經(jīng)過(guò)布局計(jì)算后的位置信息,讓我們打印一下其中的一條數(shù)據(jù)看看:
"油畫(huà)":{ children: []; data: (2) ["油畫(huà)", "手繪"]; id: "油畫(huà)"; left: 1.5; pid: "手繪"; show: true; top: 1.5 }
其中data記錄著結(jié)點(diǎn)的原始數(shù)據(jù),我們主要看看left和top,這顯示該結(jié)點(diǎn)應(yīng)該繪制的坐標(biāo)為(1.5,1.5),對(duì)照上圖,是不是就很清晰了。別的布局的設(shè)計(jì)思想也是如此,請(qǐng)耐心體會(huì)一下!
添加交互// 添加交互用例 $$("circle").bind("click", function () { // 刪除結(jié)點(diǎn) tree.delete($$(this).attr("target")); });
其實(shí)交互和布局應(yīng)該是沒(méi)有關(guān)系的,始終強(qiáng)調(diào),布局只負(fù)責(zé)計(jì)算繪圖的位置,比如上面的結(jié)點(diǎn)刪除例子,綁定點(diǎn)擊事件,調(diào)用結(jié)點(diǎn)的刪除結(jié)點(diǎn)方法即可。刪除方法刪除的只是布局保存的數(shù)據(jù),然后重繪畫(huà)面,如果你需要畫(huà)面平滑改變,修改繪圖實(shí)現(xiàn)方法即可,這里不再贅述。
例子完整代碼:https://yelloxing.github.io/c...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/99028.html
摘要:楚江數(shù)據(jù)是專業(yè)的互聯(lián)網(wǎng)數(shù)據(jù)技術(shù)服務(wù),現(xiàn)整理出零基礎(chǔ)如何學(xué)爬蟲(chóng)技術(shù)以供學(xué)習(xí),。本文來(lái)源知乎作者路人甲鏈接楚江數(shù)據(jù)提供網(wǎng)站數(shù)據(jù)采集和爬蟲(chóng)軟件定制開(kāi)發(fā)服務(wù),服務(wù)范圍涵蓋社交網(wǎng)絡(luò)電子商務(wù)分類信息學(xué)術(shù)研究等。 楚江數(shù)據(jù)是專業(yè)的互聯(lián)網(wǎng)數(shù)據(jù)技術(shù)服務(wù),現(xiàn)整理出零基礎(chǔ)如何學(xué)爬蟲(chóng)技術(shù)以供學(xué)習(xí),http://www.chujiangdata.com。 第一:Python爬蟲(chóng)學(xué)習(xí)系列教程(來(lái)源于某博主:htt...
摘要:需要說(shuō)明目前,開(kāi)發(fā)環(huán)境已經(jīng)準(zhǔn)備好了,因?yàn)槔L制樹(shù)圖,我們需要模擬數(shù)據(jù),你可以在這里下載數(shù)據(jù)我們要繪制一棵圓形樹(shù),一點(diǎn)點(diǎn)顯示,你可以最終代碼,查看效果然后在瀏覽器中打開(kāi)即可查看效果。余下的就是繪制圖形了。 作者:心葉時(shí)間:2019-01-23 17:55 溫馨提示:clay.js已經(jīng)停止維護(hù),項(xiàng)目遷移到https://github.com/yelloxing/... 準(zhǔn)備環(huán)境 我們需要用...
摘要:然而,的設(shè)計(jì)思想和他們不同,是包容而非競(jìng)爭(zhēng)。建立目的首先,本項(xiàng)目是為了端數(shù)據(jù)可視化而建立的,如果用更通俗的話說(shuō),就是為了方便使用繪制各種和圖形來(lái)反映統(tǒng)計(jì)的數(shù)據(jù),并且繪制的圖形是可交互的。 作者:心葉時(shí)間:2018-05-01 19:28 clay項(xiàng)目Github地址:https://github.com/yelloxing/... showImg(https://segmentfaul...
摘要:閉包閉包是什么閉包和匿名函數(shù)在中被引入??梢詫⒛涿瘮?shù)和閉包視作相同的概念。閉包和字符串或整數(shù)一樣,是一等值類型。何時(shí)使用我們通常把閉包當(dāng)做函數(shù)和方法的回調(diào)使用。 閉包 閉包是什么? 1).閉包和匿名函數(shù)在PHP5.3中被引入。2).閉包是指在創(chuàng)建時(shí)封裝函數(shù)周圍狀態(tài)的函數(shù),即使閉包所在的環(huán)境不存在了,閉包封裝的狀態(tài)依然存在,這一點(diǎn)和Javascript的閉包特性很相似。3).匿名函數(shù)就...
摘要:本節(jié)講學(xué)習(xí)的多進(jìn)程。和之前的的不同點(diǎn)是丟向的函數(shù)有返回值,而的沒(méi)有返回值。所以接下來(lái)讓我們來(lái)看下這兩個(gè)進(jìn)程是否會(huì)出現(xiàn)沖突。 本節(jié)講學(xué)習(xí)Python的多進(jìn)程。 一、多進(jìn)程和多線程比較 多進(jìn)程 Multiprocessing 和多線程 threading 類似, 他們都是在 python 中用來(lái)并行運(yùn)算的. 不過(guò)既然有了 threading, 為什么 Python 還要出一個(gè) multip...
閱讀 1653·2019-08-30 15:44
閱讀 2576·2019-08-30 11:19
閱讀 407·2019-08-30 11:06
閱讀 1570·2019-08-29 15:27
閱讀 3088·2019-08-29 13:44
閱讀 1631·2019-08-28 18:28
閱讀 2361·2019-08-28 18:17
閱讀 1991·2019-08-26 10:41