2017-02-14 17 views
0

グラフィックアプリケーションにグループ/グループ化機能を実装する必要があります。目的は、Adobe IllustratorまたはMicrosoft PowerPointのグループ/グループ解除機能に似ています。図形のグループ化とグループ化解除に最適なデータ構造

グループ(すなわち:グループは、順番に要素または基を含有する、要素や他のグループの両方を含めることができます)ネストすることができ

私はそれを行うための最良のデータ構造が何であるかを疑問に思って。

すぐに伝えることが可能であるべきである:

  • 要素が、私はこのような何かを考えていますそれを

が含まれている最も広いグループの兄弟グループ

  • であるかどうか:

    { 
        groups: { 
         g1: ['n1', 'n2', 'n3'], 
         g2: ['n4', 'n5', 'g1'], 
         g3: ['g2', 'n6', 'n7'] 
        }, 
        nodes { 
         n1: 'g1', 
         n2: 'g1', 
         n3: 'g1', 
         n4: 'g2', 
         n5: 'g2', 
         g1: 'n1', 
         g2: 'g3', 
         n6: 'g3', 
         n7: 'g3' 
        } 
    } 
    

    groupグループを含むノードがグループ内にあるかどうかを調べるルックアップテーブルとして機能するnodesがあります。私は、IDとは別にノードとグループを伝えることができました(ノードは常に数字です)。グループを再帰することは、兄弟のリストを提供するでしょう。

    これは、グループ内のグループを解除し、JavaScriptをチェックインするオブジェクトにカプセル化されます。

    これは正常ですか?より良い方法がありますか?

  • +0

    ノードまたはグループのコレクションを内部的に配列として保存する 'node'クラスと' group'クラスを作成します。ノード(グループだけでなく)は、デフォルトではfalseか、グループから削除された場合、またはグループ内のグループへの参照である 'in_group'プロパティを持つことができます。 – Connum

    答えて

    1

    なぜツリー構造を使用しませんか?次のようなノードを使用する:

    function Node (value, parent) { 
        this.value = value; 
        this.children = []; 
        this.parent = parent || null 
    } 
    
    Node.prototype.addChild = function (node) { … } 
    
    Node.prototype.traverse = function (fx) { 
        fx(this); 
        this.children.forEach(function (child) { 
        child.traverse(fx); 
        }); 
    } 
    … 
    
    var root = new Node({id: 100}, null); 
    

    これで、より高速なツリートラバーサルのためにポインタ/参照を追加できます。ノードがグループ内にあるかどうかをテストするには、その親がnullでないかどうかを確認するだけです。他の多くのテスト/クエリは、単純なツリートラバーサルによって実行できます。

    関連する問題