Estou tentando entender como posso colocar nós em lua nas coordenadas x e y corretas. Eu tenho esse código principalmente do manual 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
As posições que defini por mim mesmo. E este é o meu código 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}
Eu esperaria os nós vermelhos do layout lua. Alterar x e y não muda nada. Usando o código de exemplo do manual pgf/tikz, onde eles criam um círculo com os nós, resulta no mesmo gráfico que mostraram. Então, como eu usaria x,y corretamente?
Responder1
Este comportamento está documentado na seção 28.5 do manual PGF:
Assim como um algoritmo de desenho gráfico não pode saberondeum gráfico deve ser colocado em uma página, muitas vezes também não está claro qualorientaçãodeveria ter. Alguns gráficos, como as árvores, têm uma direção natural na qual “crescem”, mas para um gráfico “arbitrário” a “orientação natural” é, bem, arbitrária.
Portanto, geralmente a orientação é considerada irrelevante em um algoritmo de desenho de gráfico e o usuário deve especificar a orientação pretendida usando as teclas TikZ. Por exemplo, você poderia dizer:
\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}
para obter orientação horizontal.
Se o seu algoritmo for especial e precisar de uma orientação específica dos nós, você pode pedir ao PGF para pular a rotação do seu gráfico usando a fixed
pós-condição:
• fixo
Quando definido, nenhum pós-processamento rotacional será feito após a execução do algoritmo. Normalmente, um gráfico é girado para atender às configurações de orientação do usuário. No entanto, quando o algoritmo já tiver girado “idealmente” o gráfico, defina esta pós-condição.
Isso levaria ao seguinte código de algoritmo:
-- 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