TikZ: foreach 내부 및 외부의 여러 경로 결합

TikZ: foreach 내부 및 외부의 여러 경로 결합

길찾기 목록(숫자 패드에 표시됨)에서 경로를 생성하려고 합니다. 좌표는 올바르게 생성되었지만 \path를 여러 번 호출했기 때문에 각 세그먼트에 화살촉이 그려졌습니다. 첫 번째 세그먼트에만 시작 화살촉을 그리고 마지막 세그먼트에는 끝 화살촉을 그리도록 이 코드를 어떻게 변경합니까? 나는 \foreach 외부에 하나의 경로를 갖고 내부 좌표만 가지려고 시도했지만 실패했습니다.

편집: 선택적 인수에 전달된 모든 화살표 모양에 대해 작동해야 합니다.

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

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}

\newcommand{\directedPath}[5][]
{
  \edef\start{#2}
  \edef\stop{#3}
  \edef\step{#4}
  \edef\directions{#5}
  \coordinate (c0) at (\start);
  \foreach [var=\dir, count=\cur] in \directions
  {
    % current coordinate dx
    \pgfmathparse{(1-(1-1/sqrt(2))*mod(\dir, 2))*\step*(mod(\dir-1, 3)-1)}
    \edef\dx{\pgfmathresult}
    % current coordinate dy
    \pgfmathparse{(1-(1-1/sqrt(2))*mod(\dir, 2))*\step*(div(\dir-1, 3)-1)}
    \edef\dy{\pgfmathresult}
    % previous coordinate index
    \pgfmathparse{int(\cur - 1)}
    \xdef\prev{\pgfmathresult}
    % current coordinate
    \coordinate (c\cur) at ($(c\prev) + (\dx, \dy)$);
    % draw partial path
    \ifnum \cur>1
      \path [#1] (c\prev) -- (c\cur);
    \fi
  }
  \path [#1] (\start) -- (c1);
  \path [#1] (c\cur) -- (\stop);
}

\begin{document}

\begin{tikzpicture}
  \node [draw=green] (Start) at (0, 0) {Start};
  \node [draw=red] (End) at (5, 2) {End};
  \directedPath[draw=black, >->]{Start}{End}{1.0}{3,6,9,8,7,8,9,6,3}
\end{tikzpicture}

\end{document}

답변1

이 작업을 하나의 단일 경로로 수행해야 한다는 점에는 의문의 여지가 없지만 라이브러리를 사용하면 매우 쉽게 수행할 수 있습니다 turtle.

모든 숫자에 대한 방향(및 요소)을 정의하기만 하면 됩니다.

direction키는 "거북이"만 회전 하므로 상대 좌표에 대한 경로를 forward포함하는 키 도 포함합니다 . 즉 ,to[/tikz/turtle/how]directiondistance

to[/tikz/turtle/how] ++ (<direction>:<distance>)

Startand 는 End단순히 move toto (Start)와 (최종?) line toto (End)(또는 how현재 스타일이 무엇이든)를 삽입합니다.

물론 숫자 스타일을 설정할 때 질문의 수학을 사용할 수 있지만 이것이 더 빠릅니다(TikZ 및 작성의 경우).

sqrt(2)나는 대각선 방향에 대한 요소가 필요한 그리드와 같은 출력을 선택했습니다 . 1귀하의 질문과 동일한 거리를 얻으려면 이 요소를 로 설정하십시오 . (또한 대칭적인 결과를 얻기 위해 예제를 약간 변경했습니다.)

로 표시된 설정을 위한 보조 스타일을 만들어 사용했습니다 @. 이 스타일 /aux은 다시 사용하지 않거나 경로에서 실제로 필요하지 않으므로 경로 에서 간단히 정의하는 것이 더 나을 수도 있습니다 /tikz.

1또한 키 값을 생략하여 모든 요소를 ​​쉽게 설정할 수 있습니다 ( 값이 지정되지 않은 경우 forward기본값은 어쨌든 입니다 )./tikz/turtle/distance

@setup turtle digits/.style n args={3}{
  /tikz/turtle/#1/.style={
    /tikz/turtle/direction=#2,
    /tikz/turtle/forward}}

forward( 값을 변경하는 것이 더 일관성이 있기 때문에 키 값을 고정된 거리로 설정할 실제 이유는 없습니다 distance.)

1갑자기 키를 , 2, ... 라고 부르면 안 된다고 생각되면 9, , ... 뒤에 간단히 추가하면 1 step됩니다 .2 step9 step step#1

암호

\documentclass[tikz,convert]{standalone}
\usetikzlibrary{turtle}
\tikzset{
  @setup turtle digits/.style n args={3}{
    /tikz/turtle/#1/.style={
      /tikz/turtle/direction=#2,
      /tikz/turtle/forward={#3*\pgfkeysvalueof{/tikz/turtle/distance}}}},
  @setup turtle digits={1}{south west}{1.41421},
  @setup turtle digits={2}{south}     {1},
  @setup turtle digits={3}{south east}{1.41421},
  @setup turtle digits={4}{left}      {1},
  @setup turtle digits={6}{right}     {1},
  @setup turtle digits={7}{north west}{1.41421},
  @setup turtle digits={8}{north}     {1},
  @setup turtle digits={9}{north east}{1.41421},
  turtle/.cd,
    Start/.style={/tikz/insert path={(#1)}},
    End/.style={/tikz/insert path={to[/tikz/turtle/how] (#1)}},
    Start/.default=Start,
    End/.default=End,
}
\begin{document}
\begin{tikzpicture}
  \node [draw=green] (Start) at (0, 1) {Start};
  \node [draw=red]   (End)   at (5, 2) {End};
  \draw [draw=black, >->] [turtle={Start, 2, 3, 6, 9, 8, 7, 8, 9, 6, 3, End}];
\end{tikzpicture}
\end{document}

산출

요인으로

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

요인 없이

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

답변2

단일 경로 버전은 다음과 같습니다.

\documentclass{article}
%\url{https://tex.stackexchange.com/q/123997/86}
\usepackage{tikz}
\usetikzlibrary{calc}

\newcommand{\directedPath}[5][]
{
  \coordinate (c0) at (#2);
  \path (c0)
  \foreach [var=\dir,count=\cur] in {#5}
  {
    ++({(1-(1-1/sqrt(2))*mod(\dir, 2))*#4*(mod(\dir-1, 3)-1)},{(1-(1-1/sqrt(2))*mod(\dir, 2))*#4*(div(\dir-1, 3)-1)}) coordinate (c\cur)
  };
  \path[#1] (#2) -- (c1) \foreach [var=\dir,count=\cur] in {#5}
  {
    -- (c\cur)
  } -- (#3);
}


\begin{document}

\begin{tikzpicture}
  \node [draw=green] (Start) at (0, 0) {Start};
  \node [draw=red] (End) at (5, 2) {End};
  \directedPath[draw=black, >->]{Start}{End}{1.0}{3,6,9,8,7,8,9,6,3}
\end{tikzpicture}


\end{document}

두 개의 foreach 루프는 경로가 0이 아닌 크기의 노드에서 시작하고 끝나지만 변위는 노드 중심을 기준으로 하기 때문입니다. 두 번째 경로에는 (c1)다음에서 제기된 문제로 인해 필요한 추가 경로가 있습니다.foreach를 사용하여 여러 노드 사이에 경로 그리기. 대체 솔루션에 대해서는 해당 답변을 참조하세요.

foreach를 사용한 단일 경로

관련 정보