Como definir corretamente x, y de nós em um layout lua personalizado

Como definir corretamente x, y de nós em um layout lua personalizado

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?

insira a descrição da imagem aqui

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

informação relacionada