So legen Sie x,y von Knoten in einem benutzerdefinierten Lua-Layout richtig fest

So legen Sie x,y von Knoten in einem benutzerdefinierten Lua-Layout richtig fest

Ich versuche zu verstehen, wie ich Knoten in Lua an den richtigen x- und y-Koordinaten platzieren kann. Ich habe diesen Code hauptsächlich aus dem pgf/tikz-Handbuch:

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

Die Positionen habe ich selbst definiert. Und das ist mein Latex-Code:

\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}

Ich würde die roten Knoten vom Lua-Layout erwarten. Das Ändern von x und y ändert nichts. Wenn ich den Beispielcode aus dem pgf/tikz-Handbuch verwende, in dem sie einen Kreis mit den Knoten erstellen, erhält ich dasselbe Diagramm, das sie gezeigt haben. Wie verwende ich also x,y richtig?

Bildbeschreibung hier eingeben

Antwort1

Dieses Verhalten ist im Abschnitt 28.5 des PGF-Handbuchs dokumentiert:

Ebenso wie ein Graphenzeichnungsalgorithmus nicht wissen kann,Woein Diagramm auf einer Seite platziert werden soll, ist es auch oft unklar, welcheOrientierungdas sollte es auch. Manche Graphen, wie etwa Bäume, haben eine natürliche Richtung, in die sie „wachsen“, aber bei einem „beliebigen“ Graphen ist die „natürliche Ausrichtung“, nun ja, beliebig.

Daher wird im Allgemeinen angenommen, dass die Ausrichtung in einem Graphenzeichnungsalgorithmus irrelevant ist und der Benutzer die beabsichtigte Ausrichtung mithilfe von TikZ-Tasten angeben sollte. Sie könnten beispielsweise sagen:

\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}

um eine horizontale Ausrichtung zu erhalten.

Wenn Ihr Algorithmus speziell ist und eine bestimmte Ausrichtung der Knoten erfordert, können Sie PGF mit der fixedfolgenden Nachbedingung anweisen, die Rotation Ihres Graphen zu überspringen:

• Fest

Wenn diese Option festgelegt ist, wird nach der Ausführung des Algorithmus keine Rotationsnachbearbeitung durchgeführt. Normalerweise wird ein Diagramm gedreht, um die Orientierungseinstellungen eines Benutzers zu erfüllen. Wenn der Algorithmus das Diagramm jedoch bereits „idealerweise“ gedreht hat, legen Sie diese Nachbedingung fest.

Dies würde zum folgenden Algorithmuscode führen:

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

verwandte Informationen