사용자 정의 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

내가 직접 정의한 위치. 그리고 이것은 내 라텍스 코드입니다:

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

나는 루아 레이아웃에서 빨간색 노드를 기대합니다. 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

관련 정보