如何正确设置自定义lua布局中的节点x,y

如何正确设置自定义lua布局中的节点x,y

我试图了解如何将节点放置在 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

此行为记录在 PGF 手册第 28.5 节中:

就像图形绘制算法无法知道在哪里图表应该放在一页上,也常常不清楚哪个方向应该如此。有些图,比如树,有其“生长”的自然方向,但对于“任意”图而言,“自然方向”则是任意的。

因此,一般来说,方向在图形绘制算法中被认为是无关紧要的,用户应该使用 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

相关内容