カスタム Lua レイアウト内のノードの x、y を正しく設定する方法

カスタム Lua レイアウト内のノードの x、y を正しく設定する方法

lua 内でノードを正しい x 座標と y 座標に配置する方法を理解しようとしています。このコードは主に pgf/tikz マニュアルから取得しました。

-- This is the file RectangleTreeLayout.lua
local declare = require "pgf.gd.interface.InterfaceToAlgorithms".declare

local RectangleTreeLayoutClass = {} -- A local variable holding the class table

declare  {
    key = "rectangle tree layout",
    algorithm = RectangleTreeLayoutClass
}

function RectangleTreeLayoutClass:run()
    local g = self.digraph
    local positions = {{x=0, y=0}, {x=1*28.3465, y=0}, {x=5*28.3465, y=0}}
    for i, v in ipairs(g.vertices) do
        local pos = positions[i]
        v.pos.x = pos.x
        v.pos.y = pos.y
    end
end

位置は私が自分で定義しました。これが私の Latex コードです:

\documentclass[border=0.5cm]{standalone}
\usepackage{tikz}
\usetikzlibrary{graphs}
\usetikzlibrary{graphdrawing}
\usetikzlibrary{positioning}
\begin{document}
    \usegdlibrary{RectangleTreeLayout}
    \begin{tikzpicture}
        \graph[rectangle tree layout, no placement, nodes={draw, on grid}]
        {
            1 -> 2 -> 3;
        };
        \graph[no placement, nodes={draw, on grid, red}]
        {
            1 -> 2 [x=1] -> 3[x=5];
        };
        \draw[help lines] (0, -5) grid (5, 5);
    \end{tikzpicture}
\end{document}

lua レイアウトから赤いノードを期待します。x と y を変更しても何も変わりません。pgf/tikz マニュアルのサンプル コードを使用して、ノードで円を作成すると、示されているのと同じグラフになります。では、x、y を正しく使用するにはどうすればよいでしょうか?

ここに画像の説明を入力してください

答え1

この動作は、PGF マニュアルのセクション 28.5 に記載されています。

グラフ描画アルゴリズムが知ることができないのと同じようにどこグラフをページ上に配置すべきかどうかは、多くの場合不明瞭である。オリエンテーションそうあるべきです。木などの一部のグラフには「成長する」自然な方向がありますが、「任意の」グラフの場合、「自然な方向」は、まさに任意です。

したがって、一般的にグラフ描画アルゴリズムでは方向は無関係であると想定され、ユーザーは TikZ キーを使用して意図した方向を指定する必要があります。たとえば、次のように記述できます。

\documentclass[border=0.5cm]{standalone}
\usepackage{tikz}
\usetikzlibrary{graphs}
\usetikzlibrary{graphdrawing}
\usetikzlibrary{positioning}
\begin{document}
    \usegdlibrary{RectangleTreeLayout}
    \begin{tikzpicture}
        \graph[rectangle tree layout, no placement, nodes={draw, on grid}]
        {
            1 ->[orient=-] 2 -> 3;
        };
        \graph[no placement, nodes={draw, on grid, red}]
        {
            1 -> 2 [x=1] -> 3[x=5];
        };
        \draw[help lines] (0, -5) grid (5, 5);
    \end{tikzpicture}
\end{document}

水平方向を取得します。

アルゴリズムが特殊で、ノードの特定の方向が必要な場合は、fixed事後条件を使用して PGF にグラフの回転をスキップするように要求できます。

• 修理済み

設定すると、アルゴリズムの実行後に回転後処理は行われません。通常、グラフはユーザーの方向設定に合わせて回転されます。ただし、アルゴリズムによってグラフがすでに「理想的に」回転されている場合は、この事後条件を設定します。

これにより、次のアルゴリズム コードが生成されます。

-- This is the file RectangleTreeLayout.lua
local declare = require "pgf.gd.interface.InterfaceToAlgorithms".declare

local RectangleTreeLayoutClass = {} -- A local variable holding the class table

declare  {
    key = "rectangle tree layout",
    postconditions = {fixed = true},
    algorithm = RectangleTreeLayoutClass
}

function RectangleTreeLayoutClass:run()
    local g = self.digraph
    local positions = {{x=0, y=0}, {x=1*28.3465, y=0}, {x=5*28.3465, y=0}}
    for i, v in ipairs(g.vertices) do
        local pos = positions[i]
        v.pos.x = pos.x
        v.pos.y = pos.y
    end
end

関連情報