Как получить направление точки маркерной стрелки к касательной точки оформления на кривой

Мне нужно украсить кривую так, чтобы центр стрелки находился в центре кривой. В tikz этого можно добиться, установив значение pre length равным длине стрелки, как в следующем примере

\draw[decoration={ pre length=8pt, markings, mark=at position 0.5 with {\arrow{Stealth[black,length=8pt]}}}, postaction={decorate}] (-0.5, 0.125) to [out=60, in=120] (0.5, 0.125);

Однако теперь направление стрелки является касательной к точке, где находится кончик стрелки, что не симметрично и совсем не красиво. введите здесь описание изображения

Можно ли сделать так, чтобы направление стрелки совпадало с касательной точки украшения (здесь pos=0.5), сохраняя при этом центр стрелки в том же положении, чтобы изображение выглядело симметричным? Следующая картинка - это то, что мне нужно. введите здесь описание изображения


person Kevin Powell    schedule 10.10.2016    source источник


Ответы (2)


Вдохновленный Ответ Джейка о получении локальной системы координат произвольной точки кривой с помощью маркировки, я исправляю это.

\newcommand{\appendarrow}[3]{
\tikzset{
    middlearrow/.style args={#1}{
        decoration={
            markings,
            mark= at position 0.5 with
                {
                    \coordinate (exy1) at (#1/-6.0,0pt);
                    \coordinate (exy2) at (-0.5*#1,#1/3.0);  % 3.0 adjustable 
                    \coordinate (exy3) at (0.5*#1,0pt);
                    \coordinate (exy4) at (-0.5*#1,#1/-3.0); % 3.0 adjustable 
                },
        },
        postaction=decorate
    },
    middlearrow/.default= 3pt
}
\draw[middlearrow=#1] #3;
\fill[#2] (exy1) -- (exy2) -- (exy3) -- (exy4) -- cycle;
}

Если мы хотим нарисовать путь со средней стрелкой, просто используйте \appendarrow{arrow size}{arrow color}{path}. Например, \appendarrow{6pt}{black}{(-0.5, 0.125) to [out=60, in=120] (0.5, 0.125);} дает мне следующий рисунок введите здесь описание изображения

person Kevin Powell    schedule 05.05.2017

Что насчет этого?

\draw[thick, ->] (-0.5, 0.125) to [out=90, in=180] (0, 0.5);
\draw[thick] (0, 0.5) to [out=0, in=90] (0.5, 0.125);

На мой взгляд, разрезать кривую на две части и поставить обычную стрелку в конце первой кривой — лучшая идея.

person Cyril    schedule 05.05.2017
comment
Спасибо за предложение! Однако проблема с этим подходом заключается в том, что: во-первых, не каждый разрезанный путь легко разделить на две части; во-вторых, центр стрелки не находится в центре пути. Думаю, я разобрался с этим после некоторых усилий. Смотрите ответ ниже. - person Kevin Powell; 05.05.2017