Usando \foreach dentro de un comando de dibujo usando TIKZ

Usando \foreach dentro de un comando de dibujo usando TIKZ

Soy nuevo en el uso \foreachpero no en la codificación en general. Siguiendo el código de la respuesta número 40 de este ejemplo:Cómo dibujar una línea tangente de un punto arbitrario en un camino en TikZ

¿Cómo puedo condensar adecuadamente la tangent=0.xlista en la declaración de sorteo?

Probé algunas ideas sin éxito:

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{decorations.markings}
\begin{document}

\begin{tikzpicture}[
tangent/.style={
    decoration={
        markings,% switch on markings
        mark=
            at position #1
            with
            {
                \coordinate (tangent point-\pgfkeysvalueof{/pgf/decoration/mark info/sequence number}) at (0pt,0pt);
                \coordinate (tangent unit vector-\pgfkeysvalueof{/pgf/decoration/mark info/sequence number}) at (1,0pt);
                \coordinate (tangent orthogonal unit vector-\pgfkeysvalueof{/pgf/decoration/mark info/sequence number}) at (0pt,1);
            }
    },
    postaction=decorate
},
use tangent/.style={
    shift=(tangent point-#1),
    x=(tangent unit vector-#1),
    y=(tangent orthogonal unit vector-#1)
},
use tangent/.default=1
]
\draw [
tangent=0.1,
tangent=0.2,
tangent=0.3,
tangent=0.4,
tangent=0.5,
tangent=0.6,
tangent=0.7,
tangent=0.8,
tangent=0.9,
%%%% attempt 1
%tangent={0.05,0.01,...0.95}
%%%%% attempt 2
%\foreach \y in {0.1,0.2,...,0.9}
%{
%tangent=\y,
%}
] (0,0) arc (180:0:10);

\foreach \x [count=\xi] in {1,1,2,1,2,1,4,3,1.5}
{
\draw [red, thick,->, use tangent=\xi] (0,0) -- (0,-1*\x);
}
\end{tikzpicture}
\end{document}

para obtener un resultado como este:

figura resultante

¿Cómo puedo condensar correctamente la lista tangente=0.x, en la declaración de dibujo?

Respuesta1

Cuando necesite llamar a la misma tecla repetidamente, puede usar <key>/.list={<foreach expression>}, donde <foreach expression>puede ser una lista simple o una lista con puntos suspensivos. Entonces, en este caso, puedes usar\draw [tangent/.list={0.1,0.2,...,0.9}](0,0) arc (180:0:10);

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{decorations.markings}
\begin{document}

\begin{tikzpicture}[
tangent/.style={
    decoration={
        markings,% switch on markings
        mark=
            at position #1
            with
            {
                \coordinate (tangent point-\pgfkeysvalueof{/pgf/decoration/mark info/sequence number}) at (0pt,0pt);
                \coordinate (tangent unit vector-\pgfkeysvalueof{/pgf/decoration/mark info/sequence number}) at (1,0pt);
                \coordinate (tangent orthogonal unit vector-\pgfkeysvalueof{/pgf/decoration/mark info/sequence number}) at (0pt,1);
            }
    },
    postaction=decorate
},
use tangent/.style={
    shift=(tangent point-#1),
    x=(tangent unit vector-#1),
    y=(tangent orthogonal unit vector-#1)
},
use tangent/.default=1
]
\draw [tangent/.list={0.1,0.2,...,0.9}](0,0) arc (180:0:10);

\foreach \x [count=\xi] in {1,1,2,1,2,1,4,3,1.5}
{
\draw [red, thick,->, use tangent=\xi] (0,0) -- (0,-1*\x);
}
\end{tikzpicture}
\end{document}

Respuesta2

Este es un enfoque ligeramente diferente (admito que es una solución alternativa), sin embargo, funciona bien para este escenario.

\foreach [count=\y] \x in {1,1,2,1,2,1,4,3,1.5}
{
    \path [tangent=\y/10] (0,0) arc (180:0:10);
    \draw [red, thick, ->, use tangent=1] (0,0) -- (0,-1*\x);
}   
\draw (0,0) arc (180:0:10);

Simplemente reemplace el tikzpicturecuerpo por este código.


Código final:

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{decorations.markings}

\begin{document}

    \begin{tikzpicture}[
    tangent/.style={
        decoration={
            markings,% switch on markings
            mark=
            at position #1
            with
            {
                \coordinate (tangent point-\pgfkeysvalueof{/pgf/decoration/mark info/sequence number}) at (0pt,0pt);
                \coordinate (tangent unit vector-\pgfkeysvalueof{/pgf/decoration/mark info/sequence number}) at (1,0pt);
                \coordinate (tangent orthogonal unit vector-\pgfkeysvalueof{/pgf/decoration/mark info/sequence number}) at (0pt,1);
            }
        },
        postaction=decorate
    },
    use tangent/.style={
        shift=(tangent point-#1),
        x=(tangent unit vector-#1),
        y=(tangent orthogonal unit vector-#1)
    },
    use tangent/.default=1
    ]

    \foreach [count=\y] \x in {1,1,2,1,2,1,4,3,1.5}
    {
        \path [tangent=\y/10] (0,0) arc (180:0:10);
        \draw [red, thick,->, use tangent=1] (0,0) -- (0,-1*\x);
    }   
    \draw (0,0) arc (180:0:10); 

    \end{tikzpicture}
\end{document}

Respuesta3

Esto se puede hacer fácilmente con foreach. Utilizo un enfoque más simple que el tuyo. El resultado es

ingrese la descripción de la imagen aquí

\documentclass[border={10}]{standalone}
\usepackage{tikz}  

\begin{document}

\def \r {8}

\begin{tikzpicture}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\draw[very thick] (\r,0) arc (0:180:\r);

\foreach \angle / \y in {18/6, 36/7, 54/6, 72/7,90/6, 108/7,126/6,144/7,162/6}
\draw [<-, very thick,red]
   ( {  (\y)*cos(\angle)}, { (\y)*sin(\angle)} ) --
   ( {  (\r)*cos(\angle)}, { (\r)*sin(\angle)} );
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\end{tikzpicture}

\end{document}

información relacionada