Я пытаюсь понять, как разместить узлы в 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
Такое поведение описано в разделе 28.5 руководства PGF:
Так же, как алгоритм построения графика не может знатьгдеграфик должен быть размещен на странице, также часто неясно, какойориентациятак и должно быть. Некоторые графы, например деревья, имеют естественное направление, в котором они «растут», но для «произвольного» графа «естественная ориентация» является, ну, произвольной.
Поэтому обычно предполагается, что ориентация не имеет значения в алгоритме рисования графика, и пользователь должен указать предполагаемую ориентацию с помощью клавиш 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