如何在自訂 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

我自己定義的位置。這是我的乳膠代碼:

\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}

以獲得水平方向。

如果您的演算法很特殊且需要節點的特定方向,您可以要求 PGF 使用後置條件跳過旋轉圖形fixed

• 固定的

設定後,演算法運行後不會進行旋轉後處理。通常,圖形會旋轉以滿足使用者的方向設定。但是,當演算法已經「理想地」旋轉了圖形時,請設定此後置條件。

這將導致以下演算法程式碼:

-- 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

相關內容