TikZ: combinando múltiples caminos dentro y fuera de cada uno

TikZ: combinando múltiples caminos dentro y fuera de cada uno

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.

ingrese la descripción de la imagen aquí

\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 turtlebiblioteca.

Simplemente defina una dirección (y un factor) para cada dígito.

Como la directionllave solo gira la "tortuga", incluya también la forwardllave que incluye una to[/tikz/turtle/how]ruta a la coordenada relativa en directiony el dado distance, es decir

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

Y Startsimplemente Endinserte un move toa (Start)y un (¿final?) line toa (End)(o cualquiera que sea el howestilo 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 1para 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 /auxruta, ya que no lo volveremos a usar ni realmente lo necesitaremos en la /tikzruta.

Esto también facilita la configuración de todos los factores 1omitiendo el valor de la forwardclave (el valor predeterminado es /tikz/turtle/distancede 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 forwardclave en una distancia fija, ya que sería más consistente cambiar el distancevalor).

Si de repente siente que las claves no deberían llamarse 1, 2, ... 9sino 1 step, 2 step, ... 9 stepsimplemente agregue  stepdespué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

ingrese la descripción de la imagen aquí

sin los factores

ingrese la descripción de la imagen aquí

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í.

Camino único con foreach

información relacionada