
길찾기 목록(숫자 패드에 표시됨)에서 경로를 생성하려고 합니다. 좌표는 올바르게 생성되었지만 \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]
direction
distance
to[/tikz/turtle/how] ++ (<direction>:<distance>)
Start
and 는 End
단순히 move to
to (Start)
와 (최종?) line to
to (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 step
9 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를 사용하여 여러 노드 사이에 경로 그리기. 대체 솔루션에 대해서는 해당 답변을 참조하세요.