tikz - 노드처럼 사진 위치 지정

tikz - 노드처럼 사진 위치 지정

아래 코드를 말해보세요:

\documentclass[tikz,border=2mm]{standalone}
\usetikzlibrary{positioning}
\tikzset{
        % colmat
pics/colmat/.style={code={
        \tikzset{colmat/.cd,#1}  \def\pv##1{\pgfkeysvalueof{/tikz/colmat/##1}}%
        \edef\m{\pv{m}}%
        \edef\w{2}%
        \foreach \row [count=\j] in \m  {
            \foreach \r/\g/\b [count=\i] in \row {
                \fill[fill={rgb,255:red,\r; green,\g; blue,\b}] (\i*\w,\j*\w) rectangle ++(\w,\w);
            }%foreach
        }%foreach
}},colmat/.cd,m/.initial={{255/0/0}},/tikz/.cd,
    %
}
\begin{document}
    \begin{tikzpicture}
    \tikzset{
        box/.style={draw,minimum width=1cm,minimum height=1cm}
    }
    \def\clst{
        {200/10/10},
        {10/10/200},
        {10/200/200}%
    }
    \node[box] (A) at (0,0) {A};
    \foreach \pos in {left,right,above,below} {
        \node[\pos=1 of A,matrix] (B-\pos) {\pic{colmat={m=\clst}};\\};
    }

    \node[left=6 of A,box] (C) at (0,0) {C};
    \foreach \pos in {left,right,above,below} {
        \node[\pos=1 of C,box] (D) {D};
    }
    \end{tikzpicture}
\end{document}

A 주변의 그림 블록이 C 주변의 노드 D와 동일하게 동작하기를 바랍니다. 비슷한 질문을 찾았지만 여전히 올바른 방법을 찾지 못했습니다.

여기에 이미지 설명을 입력하세요

답변1

이 질문은 예전에도 나온 것 같아요. 비결은 노드를 노드 pic로 래핑하는 것입니다 matrix(명확하게 말하면 이는 1x1 행렬입니다). 이것은 pic행렬에 넣기를 원하지 않는 한 작동 하지만 적어도 현재로서는 pic그 자체를 사용하거나 행렬을 사용하고 싶을 수 있습니다.pic

\documentclass[tikz,border=2mm]{standalone}
\usetikzlibrary{positioning}
\tikzset{
pics/mypic/.style={code={
        \tikzset{mypic/.cd,#1}  \def\pv##1{\pgfkeysvalueof{/tikz/mypic/##1}}%
        \edef\m{\pv{m}}%
        \foreach \row [count=\j] in \m  {
            \foreach \r/\g/\b [count=\i] in \row {
                \fill[fill={rgb,255:red,\r; green,\g; blue,\b}] (\i-1,\j-1) rectangle ++(1,1);
            }%foreach
        }%foreach
    }},mypic/.cd,m/.initial={{255/0/0}},/tikz/.cd,
%
}
\begin{document}
    \begin{tikzpicture}
    \tikzset{
        box/.style={draw,minimum width=1cm,minimum height=1cm}
    }
    \def\clst{
{31/18/12}%
    }
  \node[box] (A) at (0,0) {A};
  \foreach \pos in {left,right,above,below} {
    \node[\pos=1 of A,matrix] (B-\pos) {\pic{mypic={m=\clst}};\\};
  }

\node[left=6 of A,box] (C) at (0,0) {C};
\foreach \pos in {left,right,above,below} {
    \node[\pos=1 of C,box] (D) {D};
}
    \end{tikzpicture}
\end{document}

여기에 이미지 설명을 입력하세요

더 큰 사진을 처리하는 한 가지 간단한 방법은 항목 수를 세어 대칭으로 만드는 것입니다.

\documentclass[tikz,border=2mm]{standalone}
\usetikzlibrary{positioning}
\tikzset{
        % colmat
pics/colmat/.style={code={
        \tikzset{colmat/.cd,#1}  
        \def\pv##1{\pgfkeysvalueof{/tikz/colmat/##1}}%
        \edef\m{\pv{m}}%
        \foreach \row [count=\j] in \m  {\xdef\mydimj{\j}
            \foreach \r/\g/\b [count=\i] in \row {\xdef\mydimi{\i}}}
        \typeout{\m,\mydimi,\mydimj}
        \edef\w{2}%
        \foreach \row [count=\j] in \m  {
            \foreach \r/\g/\b [count=\i] in \row {
                \fill[fill={rgb,255:red,\r; green,\g; blue,\b}]
                 (\i*\w-\mydimi/2,\j*\w-\mydimj/2) rectangle ++(\w,\w);
            }%foreach
        }%foreach
}},colmat/.cd,m/.initial={{255/0/0}},/tikz/.cd,
    %
}
\begin{document}
    \begin{tikzpicture}
    \tikzset{
        box/.style={draw,minimum width=1cm,minimum height=1cm}
    }
    \def\clst{
        {200/10/10},
        {10/10/200},
        {10/200/200}%
    }
    \node[box] (A) at (0,0) {A};
    \foreach \pos in {left,right,above,below} {
        \node[\pos=1 of A,matrix] (B-\pos) {\pic{colmat={m=\clst}};\\};
    }

    \node[left=6 of A,box] (C) at (0,0) {C};
    \foreach \pos in {left,right,above,below} {
        \node[\pos=1 of C,box] (D) {D};
    }
    \end{tikzpicture}
\end{document}

여기에 이미지 설명을 입력하세요

답변2

이와 같이?

여기에 이미지 설명을 입력하세요

right=1 of A다음과 같이 변경하세요 right=0 of A.

\pic[right=0 of A] (B) {mypic={m=\clst}};

또 다른 가능성은 tikzpicture옵션(또는 tikzset) 정의 에 있습니다.

node distance=0cm

그리고 나서 쓰세요

\pic[right=of A] (B) {mypic={m=\clst}};

답변3

업데이트됨:

드로잉 코드로

\foreach \row [count=\j] in \m {
  \foreach \r/\g/\b [count=\i] in \row {
    \fill[fill={rgb,255:red,\r; green,\g; blue,\b}]
      (\i * \w, \j * \w) rectangle ++(\w,\w);
  }
}
  • 채워진 모든 사각형에는 남서쪽 모서리가 있고 (\i*\w, \j*\w)북동쪽 모서리가 있습니다 (\i*\w + \w, \j*\w + \w).
  • \i에서 범위까지 1\mydimi범위 j에서 까지 1( 포함)에 대해 \mydimj구성된 더 큰 직사각형의 남서쪽 모서리는 에 있고 (1*\w, 1*\w)북동쪽 모서리는 에 있습니다 (\mydimi*\w + \w, \mydimj*\w + \w).
  • 따라서 더 큰 직사각형의 중심은 에 있습니다 (.5*\mydimi*\w + \w, 0.*\mydimj*\w + \w). 해당 중심을 원점에 두려면 (0, 0)다음을 사용하여 좌표를 이동합니다.
shift={(-0.5*\mydimi*\w - \w, -0.5*\mydimj*\w - \w)}

전체 예에서는 정의를 약간 단순화했습니다 pic.

\documentclass[tikz,border=2mm]{standalone}
\usetikzlibrary{positioning}

\makeatletter
\tikzset{
  % colmat
  pics/colmat/.style={code={
    \tikzset{colmat/#1}
    \foreach \row [count=\j] in \pic@colmat@m {
      \xdef\mydimj{\j}
      \foreach \r/\g/\b [count=\i] in \row {\xdef\mydimi{\i}}
    }
    \edef\w{2}%
    \foreach \row [count=\j] in \pic@colmat@m {
      \foreach \r/\g/\b [count=\i] in \row {
        \fill[fill={rgb,255:red,\r; green,\g; blue,\b},
         shift={(-0.5*\mydimi*\w - \w, -0.5*\mydimj*\w - \w)}]
          (\i * \w, \j * \w) rectangle ++(\w,\w);
      }%foreach
    }%foreach
  }},
  colmat/m/.estore in=\pic@colmat@m,
  colmat/m/.initial={{255/0/0}}
}
\makeatother

\begin{document}
\begin{tikzpicture}
  \tikzset{
    box/.style={draw,minimum width=1cm,minimum height=1cm}
  }
  \def\clst{
    {200/10/10},
    {10/10/200},
    {10/200/200}%
  }
  \node[box] (A) at (0,0) {A};
  \foreach \pos in {left,right,above,below} {
    \pic[\pos=2 of A] (B-\pos) {colmat={m=\clst}};
  }

  \node[left=6 of A,box] (C) at (0,0) {C};
  \foreach \pos in {left,right,above,below} {
    \node[\pos=1 of C,box] (D-\pos) {D};
  }
\end{tikzpicture}
\end{document}

이전 답변:

노드와 달리 그림에는 고정된 앵커가 있습니다. 해당 앵커는 (0, 0)그리기 명령 내부입니다. pgf 매뉴얼, 초를 참조하십시오. 18.2, 단락사진의 위치.

사진 정의에서 은 (0, 0)채워진 사각형의 남서쪽 모퉁이에 있습니다. 따라서 tikz는 그림의 모든 남서쪽 모서리를 다음 mypic과 같은 위치에 배치합니다 left=1 of A.

그림 정의 내에서 (0, 0)채워진 사각형의 중심으로 이동하면 문제가 해결됩니다. 여기서는 shift오프셋 옵션 을 사용합니다 . mypic중심을 원점에 유지하려면 의 그리기 명령에 사용되는 좌표를 조정하는 것이 좋습니다 .

% before
\fill[fill={...},                   ] (\i-1,\j-1) rectangle ++(1,1);
% after
\fill[fill={...}, shift={(-.5, -.5)}] (\i-1,\j-1) rectangle ++(1,1);
% for updated example in question, a shift of (0, -3) is required.

관련 정보