(u,v)의 상대 좌표에 접근하는 취약한 방법

(u,v)의 상대 좌표에 접근하는 취약한 방법

부터이 질문내용이 너무 많고 불필요한 내용이 너무 많아서 좀 더 압축되고 포괄적인 형태로 재구성하려고 노력했습니다.

quiver/after arrow/.code문제는 , 또는 의 자체 코드 조각에서 떨림 플롯 좌표(x,y,u,v)에 액세스하고 싶다는 것입니다 quiver/before arrow/.code. 다음 예는 u 및 v 값을 쉽게 변경할 수 있으므로 완전히 이해되지 않습니다. 그러나 문제는 다른 질문과 정확히 동일합니다.

코드에서 좌표에 액세스하려고 시도하는 위치와 작동하지 않는 다른 가능성이 주석 처리된 위치에 주석을 추가했습니다.

\documentclass[]{standalone} 
\usepackage{tikz,pgfplots}
\usetikzlibrary{calc} \pgfplotsset{compat=newest}

\begin{document}
  \begin{tikzpicture}
    \begin{axis}[axis equal image,enlargelimits=false,clip=false]
      % Reference plot
      \addplot[
               quiver={
                       u=x,v=y,
                      },
               ->,
               samples=5,domain=0:1
              ] {x*x};

              % own plot
      \addplot[
               quiver={
                       u=x,v=y,
                       % draw some other (e.g. orthogonal) arrows here!
                       after arrow/.code={
                                          \draw[blue,dashed,->] (0.5,0.25) -- ($ (0.5,0.25) + (0.25,-0.5)$);
                                          \draw[blue,dashed,->] (1,1) -- ($ (1,1) + (1,-1)$);
        %
        %
        % Things which are not working
        %
        %
                                          %\draw[blue,dashed,->] (x,y) -- ($ (x,y) + (v,-u)$);
                                          %\draw[blue,dashed,->] (\x,\y) -- ($ (\x,\y) + (\v,-\u)$);
                                          %\draw[blue,dashed,->] (\pgfplots@current@point@x,\pgfplots@current@point@y) -- ($ (\pgfplots@current@point@x,\pgfplots@current@point@y) + (\pgfplots@quiver@v,-\pgfplots@quiver@u)$);
                                         };
                      },
               draw=none,
               samples=5,domain=0:1
              ] {x*x};

   \end{axis}
  \end{tikzpicture} 

\end{document}

답변1

현재 의 디자인은 quiver매우 유연하지 않습니다. 화살표가 그려질 때쯤에는 (x,y) 좌표가 저장되고 \pgf@x( \pgf@yu,v) 좌표는 절대 좌표로 변환됩니다. 선택의 여지가 많지 않습니다.

아마도 동일한 함수를 다른 quiver.

\documentclass[border=9,tikz]{standalone} 
\usepackage{pgfplots}\pgfplotsset{compat=newest}

\begin{document}
  \begin{tikzpicture}
    \begin{axis}[axis equal]
      % Reference plot
      \addplot[
               quiver={u=x,v=y},
               ->,
               samples=10,domain=0:1
              ] {x*x};

              % own plot
      \addplot[
               quiver={u=y,v=-x},
               ->,blue,
               samples=10,domain=0:1
              ] {x*x};

   \end{axis}
  \end{tikzpicture} 
\end{document}

(u,v)의 상대 좌표에 접근하는 취약한 방법

\documentclass[border=9,tikz]{standalone} 
\usepackage{pgfplots}\pgfplotsset{compat=newest}

\begin{document}

\makeatletter
\def\pgfplotsplothandlerquiver@vis@path#1{%
    % remember (x,y) in a robust way
    #1%
    \pgfmathsetmacro\pgfplots@quiver@x{\pgf@x}%
    \pgfmathsetmacro\pgfplots@quiver@y{\pgf@y}%
    % calculate (u,v) in relative coordinate
    \pgfplotsaxisvisphasetransformcoordinate\pgfplots@quiver@u\pgfplots@quiver@v\pgfplots@quiver@w%
    \pgfplotsqpointxy{\pgfplots@quiver@u}{\pgfplots@quiver@v}%
    \pgfmathsetmacro\pgfplots@quiver@u{\pgf@x-\pgfplots@quiver@x}%
    \pgfmathsetmacro\pgfplots@quiver@v{\pgf@y-\pgfplots@quiver@y}%
    % move to (x,y) and start drawing
    {%
        \pgftransformshift{\pgfpoint{\pgfplots@quiver@x}{\pgfplots@quiver@y}}%
        \pgfpathmoveto{\pgfpointorigin}%
        \pgfpathlineto{\pgfpoint\pgfplots@quiver@u\pgfplots@quiver@v}%
    }%
}%

  \begin{tikzpicture}
    \begin{axis}[axis equal]
      \addplot[
               quiver={u=x,v=y,
                 after arrow/.code={
                   \relax{% always protect the shift
                     \pgftransformshift{\pgfpoint{\pgfplots@quiver@x}{\pgfplots@quiver@y}}%
                     \node[below right]{\tiny$(u,v)=(\pgfplots@quiver@u,\pgfplots@quiver@v)$};
                   }
                 }
               },
               ->,
               samples=10,domain=-1:1
              ] {x*x};
   \end{axis}
  \end{tikzpicture}
\end{document}

# 확인... 다음 코드는 `\pgfplots@quiver@x`가 캔버스 x 좌표이고 `\pgfplots@quiver@u`가 캔버스, 상대 u 좌표가 되도록 내부 프로시저를 수정합니다. \documentclass[border=9,tikz]{독립형} \usepackage{pgfplots}\pgfplotsset{compat=newest} \begin{document} \makeatletter \def\pgfplotsplothandlerquiver@vis@path#1{% % 기억(x,y) 강력한 방식으로 #1% \pgfmathsetmacro\pgfplots@quiver@x{\pgf@x}% \pgfmathsetmacro\pgfplots@quiver@y{\pgf@y}% % 상대 좌표 \pgfplotsaxisvisphasetransformcoordinate\에서 (u,v)를 계산합니다. pgfplots@quiver@u\pgfplots@quiver@v\pgfplots@quiver@w% \pgfmathsetmacro\pgfplots@quiver@u{\pgfplots@quiver@u-\pgfplots@quiver@x}% \pgfmathsetmacro\pgfplots@quiver@v {\pgfplots@quiver@v-\pgfplots@quiver@y}% % (x,y)로 이동하고 그리기 시작 {% \pgftransformshift{\pgfpoint{\pgfplots@quiver@x}{\pgfplots@quiver@y} }% \pgfpathmoveto{\pgfpointorigin}% \pgfpathlineto{\pgfplotsqpointxy\pgfplots@quiver@u\pgfplots@quiver@v}% }% }% \begin{tikzpicture} \begin{축}[축 동일] \addplot[ 떨림 ={u=x,v=y, arrow/.code={ \relax{% 이후 항상 이동을 보호합니다 \pgftransformshift{\pgfpoint{\pgfplots@quiver@x}{\pgfplots@quiver@y}}% \node [오른쪽 아래]{$(u,v)=(\pgfplots@quiver@u,\pgfplots@quiver@v)$}; } } }, ->, 샘플=10,도메인=0:1 ] {x*x}; \end{축} \end{tikzpicture} \end{document} [![][2]][2]

부인 성명

현재 before arrowafter arrow패키지의 다른 곳에서는 사용되지 않습니다. (u,v)가 절대좌표라는 사실은 향후 변경될 수 있습니다.

관련 정보