根据坐标改变 TikZ 的“路径”

根据坐标改变 TikZ 的“路径”

使用ncbar此问题的风格:TikZ 是否有与 PSTricks \ncbar 命令等效的命令?,条形图出现在节点的顶部还是底部取决于\tikztostart\tikztotarget坐标的相对位置。如果\tikztostart位于 的左侧\tikztotarget,则条形图出现在顶部,但如果\tikztostart位于 的右侧,则\tikztotarget条形图出现在底部。将条形图的角度从 改为90会将-90其重新置于顶部。

我想制作一个宏,将条形图统一放在顶部,与起始节点和目标节点的相对位置无关。原则上,最简单的方法似乎是测试起始和目标坐标的相对位置,然后相应地调整角度,但我不知道该怎么做。

这是一个例子。我希望自动创建红色箭头,而无需明确传递角度。

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\tikzset{
    ncbar angle/.initial=90,
    ncbar/.style={
        to path={
           (\tikztostart)
        -- ($(\tikztostart)!#1!\pgfkeysvalueof{/tikz/ncbar angle}:(\tikztotarget)$)
        -- ($(\tikztotarget)!($(\tikztostart)!#1!\pgfkeysvalueof{/tikz/ncbar angle}:(\tikztotarget)$)!\pgfkeysvalueof{/tikz/ncbar angle}:(\tikztostart)$)
        -- (\tikztotarget)
    }},
    ncbar/.default=.5cm
}
\newcommand{\toparrow}[3][]{\draw[->] (#2) [ncbar,#1] to (#3);}
\begin{document}
\begin{tikzpicture}
\node[draw] (A) at (0,0) {A};
\node[draw] (B) at (1,0) {B};
\toparrow{A}{B}
\toparrow{B}{A}
\toparrow[ncbar angle=-90,red]{B.north east}{A.north west} % I want this automatically
\end{tikzpicture}
\end{document}

代码输出

答案1

对原始版本进行了一些修改,希望逻辑正确,并有一个打开/关闭行为的开关

\documentclass[tikz]{standalone}
\usetikzlibrary{calc}
\newif\iftikzncbarauto
\tikzset{
    ncbar angle/.initial=90,
    ncbar auto/.is if=tikzncbarauto,
    ncbar auto,
    ncbar/.style={
        to path={\iftikzncbarauto let \p1=(\tikztostart),\p2=(\tikztotarget),\n1={atan2(\y2-\y1,\x2-\x1)},\n3={(\n1<0?360+\n1:\n1)},\n2={((\n3<=270)&&(\n3>90)?-1:1)} in 
        \else let \n2=1 in \fi
           (\tikztostart)
        -- ($(\tikztostart)!#1!\n2*\pgfkeysvalueof{/tikz/ncbar angle}:(\tikztotarget)$)
        -- ($(\tikztotarget)!($(\tikztostart)!#1!\n2*\pgfkeysvalueof{/tikz/ncbar angle}:(\tikztotarget)$)!\pgfkeysvalueof{/tikz/ncbar angle}:(\tikztostart)$)
        -- (\tikztotarget)
    }},
    ncbar/.default=.5cm
}
\newcommand{\toparrow}[3][]{\draw[->] (#2) [ncbar,#1] to (#3);}
\begin{document}
\begin{tikzpicture}
\node[draw] (A) at (-1,1) {A};
\node[draw] (B) at (1,0) {B};
\toparrow{A}{B}
\toparrow{B}{A}
\toparrow[red]{B.north east}{A.north west} % I want this automatically
\end{tikzpicture}
\end{document}

相关内容