Как нарисовать градиентные стрелки на изоконтуре

Как нарисовать градиентные стрелки на изоконтуре

Используя pgfplots, я рисую изоконтур функции f(x,y): линии, такие как f(x,y)=C, где C — выбранное число.

См. пример ниже:

\documentclass{article}

\usepackage{pgfplots}
\pgfplotsset{compat=newest}

\begin{document}

\begin{center}
    \begin{tikzpicture}[scale=0.85]
    \begin{axis}[   xmin=-4,xmax=12, ymin=-4,ymax=4,x=1cm,y=1cm,at={(-4cm,-4cm)}]]
    \addplot +[no markers,
    raw gnuplot,
    thick,dashed,
    empty line = jump, % not strictly necessary, as this is the default behaviour in the development version of PGFPlots
    ] gnuplot {
        set contour base;
        set cntrparam levels discrete -2,-1.1,-1.4;
        unset surface;
        set view map;
        set isosamples 500;
        set samples 500;
        splot -2/sqrt((x-7.5)^2+y^2)-3/sqrt((x-0.5)^2+y^2);
    };
    \end{axis}
    \end{tikzpicture}
\end{center}
\end{document}

изоконтур Я могу нарисовать векторы градиента в любой заданной точке, но не знаю, как разместить их в разных местах на изоконтурной кривой.

введите описание изображения здесь

Как мне получить положения различных точек на этой пунктирной синей кривой?

решение1

Вы можете использовать тот факт, что можете получить доступ к координатам контурных графиков. Поскольку это несколько несвязанных сегментов, указания posнедостаточно. Вместо этого вам также нужно использовать pos segment, что объясняется на стр. 358 руководства pgfplots v1.16. Однако априори не ясно, какой сегмент имеет какой индекс. Для упрощения я добавил стиль, который добавляет градиентную стрелку, которая ортогональна касательной контура в этой точке.

\documentclass{article}

\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\begin{document}

\begin{center}
 \begin{tikzpicture}[gradient arrow/.style={
 insert path={coordinate[pos=#1,sloped,
     above=\pgfkeysvalueof{/tikz/ga/above}]  (aux-1)
    coordinate[pos=#1,sloped,
     above=\pgfkeysvalueof{/tikz/ga/above}+\pgfkeysvalueof{/tikz/ga/length}] (aux-2)
    (aux-1) edge[/tikz/ga/arrow] 
    (aux-2)}},ga/.cd,
    above/.initial=3pt,
    length/.initial=12pt,
    arrow/.style={-stealth,black,solid,thick}]
  \begin{axis}[scale=0.85,xmin=-4,xmax=12, ymin=-4,ymax=4,x=1cm,y=1cm,at={(-4cm,-4cm)}]]
   \addplot +[no markers,name=contour,
    raw gnuplot,
    thick,dashed,
    empty line = jump, % not strictly necessary, as this is the default behaviour in the development version of PGFPlots
    ] gnuplot {
        set contour base;
        set cntrparam levels discrete -2,-1.1,-1.4;
        unset surface;
        set view map;
        set isosamples 500;
        set samples 500;
        splot -2/sqrt((x-7.5)^2+y^2)-3/sqrt((x-0.5)^2+y^2);
    } 
    [pos segment=1]
    [gradient arrow/.list={0.2,0.8}]
    [pos segment=3,/tikz/ga/arrow/.append style={red},/tikz/ga/length=10pt]
    [gradient arrow/.list={0.2,0.8}];
  \end{axis}
 \end{tikzpicture}
\end{center}
\end{document}

введите описание изображения здесь

Связанный контент