我试图了解如何将节点放置在 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}
获得水平方向。
如果您的算法很特殊并且需要节点的特定方向,您可以要求 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