下图中,我通过手动进行大量计算,实现了节点 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}