Как правильно задать x,y узлов в пользовательском макете lua

Как правильно задать x,y узлов в пользовательском макете lua

Я пытаюсь понять, как разместить узлы в 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

Связанный контент