我試圖了解如何在 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