如何在 TikZ 中均匀分布节点边界上的边缘

如何在 TikZ 中均匀分布节点边界上的边缘

下图中,我通过手动进行大量计算,实现了节点 3 边界上三条曲线的均匀分布。这很麻烦,也不灵活。有没有一种简单快捷的解决方案,让 TikZ 自动进行均匀分布?

\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\node [circle] (1) at (0, 0) {1};
\node [circle] (2) at (1,-3) {2};
\node [circle] (3) at (5,-2) {3};
\node [circle] (4) at (4, 1) {4};
\path (1) edge (2) (2) edge (3) (3) edge (4) (4) edge (1);

\path (4) edge [out=-100, in=129.835] (3); % These in values
\path (1) edge [out=-20,  in=151.236] (3); % are computed
\path (2) edge [out=20,   in=172.636] (3); % manually, yuk!
\end{tikzpicture}
\end{document}

在此处输入图片描述

我的一个想法是在直线相切的 3 边界点之间创建一个不可见的圆弧,然后通过在该圆弧上放置 、 和 的坐标来创建曲线的起点/终点[pos=0.25][pos=0.5]但是[pos=0.75],我不确定这是否是最干净的解决方案,因为这需要创建许多辅助元素,而且(更重要的是)我不知道如何检索 4 和 2 的直线相切的 3 边界点。

答案1

我提出了一个基于pgf命令的解决方案\pgfmathanglebetweenpoints,并\pgfmathanglebetweenlines在手册第 1047 页定义)。例如,由点确定的角度A, 和按此顺序(\angleBAD在下面的代码中)以及矢量形成的角度AB水平轴(\argAB在代码中)允许我们找到你要寻找的角度,\argAB+k*\angleBAD/4就像k=1,2,3

在图中,你的构造是灰色的,用于比较。为了连贯性,我决定内边缘必须平分角度C, 和在此处输入图片描述

代码 (本地命令\computearg基于angle@percusse 的答案pgfmathanglebetweenpoints 总是返回 90

\documentclass[margin=.3cm]{standalone}
\usepackage{tikz}
\begin{document}


\newcommand{\computearg}[2]{\pgfmathanglebetweenpoints{\pgfpointanchor{#1}{center}}{\pgfpointanchor{#2}{center}}}
\newcommand{\computeangle}[3]{\pgfmathanglebetweenlines{\pgfpointanchor{#2}{center}}{\pgfpointanchor{#1}{center}}{\pgfpointanchor{#2}{center}}{\pgfpointanchor{#3}{center}}}

\begin{tikzpicture}
  \node[circle] (C) at (0, 0) {C};
  \node[circle] (D) at (1, -3) {D};
  \node[circle] (A) at (5, -2) {A};
  \node[circle] (B) at (4, 1) {B};
  \path (C) edge (D) (D) edge (A) (A) edge (B) (B) edge (C);

  \computearg{A}{B}
  \edef\argAB{\pgfmathresult}
  \computearg{B}{C}
  \edef\argBC{\pgfmathresult}
  \computearg{C}{D}
  \edef\argCD{\pgfmathresult}
  \computearg{D}{A}
  \edef\argDA{\pgfmathresult}
  \computeangle{B}{A}{D}
  \edef\angleBAD{\pgfmathresult}
  \computeangle{C}{B}{A}
  \edef\angleCBA{\pgfmathresult}
  \computeangle{D}{C}{B}
  \edef\angleDCB{\pgfmathresult}
  \computeangle{A}{D}{C}
  \edef\angleADC{\pgfmathresult}

  \path[red, thick]
  (A) edge[out={\argAB+\angleBAD/4}, in={\argBC+\angleCBA/2}] (B)
  (A) edge[out={\argAB+\angleBAD/2}, in={\argCD+\angleDCB/2}] (C)
  (A) edge[out={\argAB+3*\angleBAD/4}, in={\argDA+\angleADC/2}] (D);
\end{tikzpicture}
\end{document}

相关内容