
Estoy intentando generar una ruta a partir de una lista de direcciones (como se ve en el teclado numérico). Las coordenadas se generan correctamente, pero debido a que uso múltiples llamadas a \path, las puntas de flecha se dibujan en cada segmento. ¿Cómo cambio este código para dibujar solo la punta de flecha inicial en el primer segmento y la punta de flecha final en el último segmento? Intenté sin éxito tener una \ruta fuera de \foreach y solo las coordenadas dentro.
editar: debería funcionar para cualquier forma de flecha pasada en el argumento opcional.
\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}
Respuesta1
No hay duda de que esto debe hacerse en una sola ruta, pero puede hacerlo fácilmente con la turtle
biblioteca.
Simplemente defina una dirección (y un factor) para cada dígito.
Como la direction
llave solo gira la "tortuga", incluya también la forward
llave que incluye una to[/tikz/turtle/how]
ruta a la coordenada relativa en direction
y el dado distance
, es decir
to[/tikz/turtle/how] ++ (<direction>:<distance>)
Y Start
simplemente End
inserte un move to
a (Start)
y un (¿final?) line to
a (End)
(o cualquiera que sea el how
estilo actual).
Por supuesto, puede usar las matemáticas de su pregunta en la configuración de los estilos de dígitos, pero esto es más rápido (para TikZ y para escribir).
Opté por una salida en forma de cuadrícula que necesita el factor sqrt(2)
para las direcciones diagonales. Establezca este factor en 1
para obtener la misma distancia que en su pregunta. (También cambié un poco el ejemplo para obtener un resultado simétrico).
He creado y utilizado un estilo auxiliar para la configuración, marcado con un archivo @
. También puede ser preferible simplemente definir este estilo en una /aux
ruta, ya que no lo volveremos a usar ni realmente lo necesitaremos en la /tikz
ruta.
Esto también facilita la configuración de todos los factores 1
omitiendo el valor de la forward
clave (el valor predeterminado es /tikz/turtle/distance
de todos modos si no se proporciona ningún valor), es decir
@setup turtle digits/.style n args={3}{
/tikz/turtle/#1/.style={
/tikz/turtle/direction=#2,
/tikz/turtle/forward}}
(No existe una razón real para establecer el valor de la forward
clave en una distancia fija, ya que sería más consistente cambiar el distance
valor).
Si de repente siente que las claves no deberían llamarse 1
, 2
, ... 9
sino 1 step
, 2 step
, ... 9 step
simplemente agregue step
después #1
.
Código
\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}
Producción
con los factores
sin los factores
Respuesta2
Aquí hay una versión de ruta única:
\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}
Los dos bucles foreach se deben a que el camino comienza y termina en nodos de tamaño distinto de cero, pero los desplazamientos son relativos a los centros de los nodos. En el segundo camino, hay un extra (c1)
que se necesita debido al problema planteado enDibuja un camino entre muchos nodos usando foreach. Para obtener una solución alternativa, consulte las respuestas allí.