如何从 A 到 B 画一条漂亮的狗链?

如何从 A 到 B 画一条漂亮的狗链?

我需要帮助画一条从 A 到 B 的狗绳,长约 8 米。房子长 3 米,宽 5 米。

在此处输入图片描述

\documentclass[tikz]{standalone}
\usepackage{graphicx}
\usetikzlibrary{}

\begin{document}
\begin{tikzpicture}

\draw (0,0) rectangle (5,3) ;

\fill (1,3) circle (1pt) node[anchor=south] {$A$} ;

\begin{scope}[shift={(7,4)}]
\node {\includegraphics[scale=.2]{idefix}} ;
\fill[red] (-.26,-.02) circle (.3pt) node[anchor=west] {$B$} ;
\end{scope}

\end{tikzpicture}

\end{document} 

答案1

这个问题很有趣。所以你想要一条连接点 (A) 和 (B) 的“松散”曲线,其长度为 8 个单位。

显然,困难的部分是确保长度为 8 个单位(或至少接近该数量)。一般问题取决于选择哪条曲线(参见维基百科的弧长文章),但一般来说没有封闭的解决方案。

首先,我尝试绘制一个圆弧,并尝试计算(用纸和铅笔)所需的角度和半径,以提供长度 8,假设弦(距离 (A)--(B))在当前设置下为 6。过了一会儿,我受够了(自从上次使用纸和铅笔以来已经花了太多时间 :-)),于是换了一种方法。

通过这个答案我找到了一个可以计算贝塞尔曲线长度的python库(这也是一个通常通过近似值解决的难题),经过反复试验,我找到了一个美观且具有大约8个长度单位的解决方案:

\usetikzlibrary{calc}

\begin{tikzpicture}

\draw (0,0) rectangle (5,3) ;
\coordinate (A) at (1,3);
\coordinate (B) at (7,4);

\fill (A) circle (1pt) node[anchor=south] {$A$} ;

\begin{scope}[shift={(B)}]
%\node (idefix) {{idefix}} ;
\fill[red] (-.26,-.02) circle (.3pt) node[anchor=west] {$B$} ;
\end{scope}

\draw[blue,thick] (A) .. controls (4,6) and (8,0) .. (B);

\end{tikzpicture}

结果:

结果

长度计算:

>>> from pyx import path, unit
>>> bez = path.curve(1,3,4,6,8,0,7,4)
>>> unit.tocm(bez.arclen())
7.955089832696614

更新:为了使绳子看起来更自然,并且假设其长度不会发生太大变化,可以使用“随机步骤”装饰:

\usetikzlibrary{calc,decorations,decorations.pathmorphing}

\begin{tikzpicture}

\draw (0,0) rectangle (5,3) ;
\coordinate (A) at (1,3);
\coordinate (B) at (7,4);

\fill (A) circle (1pt) node[anchor=south] {$A$} ;

\begin{scope}[shift={(B)}]
%\node (idefix) {{idefix}} ;
\fill[red] (-.26,-.02) circle (.3pt) node[anchor=west] {$B$} ;
\end{scope}

\draw[blue,thick,decorate,decoration={random steps}, rounded corners=1mm] (A) .. controls (4,6) and (8,0) .. (B);

\end{tikzpicture}

结果:

结果

答案2

你能用绳子吗?

\documentclass[tikz,border=5pt]{standalone}
\usepackage{graphicx}
\usetikzlibrary{hobby}

\begin{document}
\begin{tikzpicture}

\draw (0,0) rectangle (5,3) ;

\fill (1,3) circle (1pt) node[anchor=south] (a) {$A$} ;

\begin{scope}[shift={(7,4)}]
\node (b){\includegraphics[scale=.2]{dog}} ;
\fill[red] (-.26,-.02) circle (.3pt) node[anchor=west] {$B$} ;
\end{scope}

\draw[use Hobby shortcut,thick,tension=0.5,smooth]([out angle=30]a.south) .. (2,3.6) .. (2.5,3.7) .. (3,4)
       .. (3.5,3.7) .. (4,3.7) .. (5,3.9) .. (6,3.5) .. ([in angle=160]b);
\end{tikzpicture}

\end{document} 

在此处输入图片描述

相关内容