Cómo configurar correctamente x,y de nodos dentro de un diseño lua personalizado

Cómo configurar correctamente x,y de nodos dentro de un diseño lua personalizado

Estoy tratando de entender cómo puedo colocar nodos dentro de lua en las coordenadas xey correctas. Tengo este código principalmente del manual de 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

Las posiciones las he definido yo mismo. Y este es mi código de 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}

Esperaría los nodos rojos del diseño lua. Cambiar xey no cambia nada. Usando el código de ejemplo del manual pgf/tikz donde crean un círculo con los nodos, se obtiene el mismo gráfico que han mostrado. Entonces, ¿cómo usaría x,y correctamente?

ingrese la descripción de la imagen aquí

Respuesta1

Este comportamiento está documentado en la sección 28.5 del manual de PGF:

Así como un algoritmo de dibujo de gráficos no puede saberdóndeSi se debe colocar un gráfico en una página, a menudo tampoco está claro cuálorientacióndeberia tener. Algunos gráficos, como los árboles, tienen una dirección natural en la que “crecen”, pero para un gráfico “arbitrario” la “orientación natural” es, bueno, arbitraria.

Por lo general, se supone que la orientación es irrelevante en un algoritmo de dibujo de gráficos y el usuario debe especificar la orientación deseada utilizando las teclas TikZ. Por ejemplo, podrías decir:

\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 obtener orientación horizontal.

Si su algoritmo es especial y necesita una orientación específica de los nodos, puede pedirle a PGF que omita la rotación de su gráfico usando la fixedposcondición:

• fijado

Cuando se establece, no se realizará ningún posprocesamiento rotacional después de que se haya ejecutado el algoritmo. Por lo general, se gira un gráfico para cumplir con la configuración de orientación del usuario. Sin embargo, cuando el algoritmo ya haya rotado “idealmente” el gráfico, establezca esta poscondición.

Esto conduciría al siguiente 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

información relacionada