成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

clay教程二之布局的使用

Forest10 / 2770人閱讀

摘要:上圖是布局的計(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)始吧!

繪制圖形

$$("" +
    // 繪制連線
    "" +
    // 繪制結(jié)點(diǎn)
    "" +
    // 繪制文字
    "" +
    "").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

相關(guān)文章

  • 零基礎(chǔ)如何學(xué)爬蟲(chóng)技術(shù)

    摘要:楚江數(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...

    KunMinX 評(píng)論0 收藏0
  • 使用clay.js繪制一棵圓形樹(shù)

    摘要:需要說(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)境 我們需要用...

    FingerLiu 評(píng)論0 收藏0
  • 數(shù)據(jù)可視化之clay:設(shè)計(jì)思想和建立初衷

    摘要:然而,的設(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...

    XFLY 評(píng)論0 收藏0
  • PHP新特性之閉包、匿名函數(shù)

    摘要:閉包閉包是什么閉包和匿名函數(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ù)就...

    luzhuqun 評(píng)論0 收藏0
  • python綜合學(xué)習(xí)二之多進(jìn)程

    摘要:本節(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...

    gityuan 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<