Tikz 경로에 원활하게 연결
Tikz를 사용하여 등반 매듭을 그리려고합니다 .
이 답변의 코드를 수정했습니다. https://tex.stackexchange.com/a/283009/229885Tikz 경로를 사용하여 3D 느낌의 로프를 그릴 수 있습니다 (기본 아이디어는 3D 모양을 얻기 위해 다양한 너비와 색상의 여러 경로를 중첩하는 것입니다). 그것은 훌륭하게 작동하지만 나를 괴롭히는 문제가 있으며 해결 방법을 모릅니다.
아래 그림에서 두 개의 매듭을 볼 수 있습니다. 분홍색은 단일 경로를 사용하여 그려졌고 흰색은 두 경로를 사용하여 그려졌습니다. 로프 교차를 올바르게 표현하려면 경로를 깰 필요가 있지만 그렇게하면 두 경로가 만나는 "이음새"를 볼 수 있습니다.

이 그림을 만드는 데 사용한 코드는 다음과 같습니다.
\documentclass[tikz, border=2mm]{standalone}
%%% The "Rope" command %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
% \Rope[further options]{color}{width}{path definition} %
% %
\newcommand{\Rope}[4][] %
{ \pgfmathsetmacro{\RopeLevels}{25} %
\foreach \RopeLevel in {1,...,\RopeLevels} %
{ \pgfmathsetmacro{\RopeShade} %
{100 * (\RopeLevel-0.5) / \RopeLevels} %
\pgfmathsetlengthmacro{\RopeWidth} %
{sqrt(pow(#3, 2) - pow(#3 * (\RopeLevel-1) / \RopeLevels, 2))} %
\draw[#2!\RopeShade!black, line width=\RopeWidth, #1] #4; %
} %
} %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\begin{tikzpicture}
\Rope[rounded corners]{pink} {2mm}{ (0.0, 0.0) to (1.0, 1.0) to (0.0, 1.0) to (1.0, 0.0) }
\Rope[rounded corners]{white}{2mm}{ (1.5, 0.0) to (2.5, 1.0) to (2.0, 1.0) }
\Rope[rounded corners]{white}{2mm}{ (2.0, 1.0) to (1.5, 1.0) to (2.5, 0.0) }
\end{tikzpicture}
\end{document}
주어진 좌표를 넘어서 경로를 확장하는 새로운 화살표 스타일을 정의하려고했지만 이음새는 여전히 표시됩니다.
내 질문은 다음과 같습니다.
- 이 이음새가 실제입니까 아니면 PDF 리더로 만든 인공물입니까? (Xubuntu 20.04.1에서 Atril 1.24.0을 사용하고 있습니다)
- Tikz 경로에 원활하게 참여할 수있는 방법이 있습니까?
- 일반적으로 LaTeX에서 등반 매듭을 그리는 더 좋은 방법이 있습니까?
미리 감사드립니다.
답변
다음은 교차로 근처의 경로 부분을 다시 그려 고가도로 모양을 만드는 버전입니다. 이것은 사실상 knots
패키지가하는 일입니다. 더 복잡한 경로를 그리려면 해당 라이브러리를 살펴볼 가치가있을 수 있지만이 경우 교차점이 어디에 있는지 알기 때문에 필요하지 않습니다.
\documentclass{article}
%\url{https://tex.stackexchange.com/q/572839/86}
\usepackage{tikz}
%%% The "Rope" command %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
% \Rope[further options]{color}{width}{path definition} %
% %
\newcommand{\Rope}[4][] %
{ \pgfmathsetmacro{\RopeLevels}{25} %
\foreach \RopeLevel in {1,...,\RopeLevels} %
{ \pgfmathsetmacro{\RopeShade} %
{100 * (\RopeLevel-0.5) / \RopeLevels} %
\pgfmathsetlengthmacro{\RopeWidth} %
{sqrt(pow(#3, 2) - pow(#3 * (\RopeLevel-1) / \RopeLevels, 2))} %
\draw[#2!\RopeShade!black, line width=\RopeWidth, #1] #4; %
} %
} %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\begin{tikzpicture}
\Rope[rounded corners]{pink} {2mm}{ (0.0, 0.0) to (1.0, 1.0) to (0.0, 1.0) to (1.0, 0.0) }
\begin{scope}[xshift=1.5cm]
\Rope[rounded corners]{white} {2mm}{ (0.0, 0.0) to (1.0, 1.0) to (0.0, 1.0) to (1.0, 0.0) }
\clip (0.5,0.5) circle[radius=3mm];
\Rope[rounded corners]{white} {2mm}{ (0.0, 0.0) to (1.0, 1.0) }
\end{scope}
\end{tikzpicture}
\end{document}
그러면 다음 이미지가 생성됩니다.

이제 클립의 경계에 인공물이 있습니다. 이것은 뷰어에서만 볼 수 있으며 인쇄 할 때는 나타나지 않습니다. 클리핑 경로가 날카롭지 않기 때문에 나타납니다. 따라서 로프 스타일에서와 같이 선이 곱해지면 아래쪽 레벨의 일부가 경계를 통해 표시됩니다.
이를 방지하는 한 가지 방법은 아래 레이어가 그 위에있는 레이어보다 약간 작은 원으로 잘 리도록하는 것입니다 (tikz knot 라이브러리의 "원 자르기" 에 문제가 있는 아이디어를 적용 ). 경로가 루프 내부에 그려 지므로 필요할 때 내부에 클리핑 경로를 추가 할 수있는 후크를 제공해야합니다. 이를 위해 명령 내부에 선택적 스타일이있는 범위를 추가했습니다. 여기에 적절한 클립을 전달하면 인공물을 제거 할 수 있습니다.
\documentclass{article}
%\url{https://tex.stackexchange.com/q/572839/86}
\usepackage{tikz}
%%% The "Rope" command %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
% \Rope[further options]{color}{width}{path definition} %
% %
\newcommand{\Rope}[4][] %
{ \pgfmathsetmacro{\RopeLevels}{25} %
\foreach \RopeLevel in {1,...,\RopeLevels} %
{ \pgfmathsetmacro{\RopeShade} %
{100 * (\RopeLevel-0.5) / \RopeLevels} %
\pgfmathsetlengthmacro{\RopeWidth} %
{sqrt(pow(#3, 2) - pow(#3 * (\RopeLevel-1) / \RopeLevels, 2))} %
\begin{scope}[rope scope/.try]
\draw[#2!\RopeShade!black, line width=\RopeWidth, #1] #4; %
\end{scope}
} %
} %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\begin{tikzpicture}
\Rope[rounded corners]{pink} {2mm}{ (0.0, 0.0) to (1.0, 1.0) to (0.0, 1.0) to (1.0, 0.0) }
\begin{scope}[xshift=1.5cm]
\Rope[rounded corners]{white} {2mm}{ (0.0, 0.0) to (1.0, 1.0) to (0.0, 1.0) to (1.0, 0.0) }
\tikzset{
rope scope/.code={
\clip (0.5,0.5) circle[radius={3mm + \RopeLevel/25 pt}];
}
}
\Rope[rounded corners]{white} {2mm}{ (0.0, 0.0) to (1.0, 1.0) }
\end{scope}
\end{tikzpicture}
\end{document}
이것은 다음을 생성합니다.

경로를 음수 길이로 줄여서 길이를 늘려 작은 겹침을 만들 수 있습니다. 이 트릭은 많은 시청자의 문제를 치료하지만 전부는 아닙니다. 적어도 모든 배율 수준에서는 아닙니다.
\documentclass[tikz, border=2mm]{standalone}
%%% The "Rope" command %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
% \Rope[further options]{color}{width}{path definition} %
% %
\newcommand{\Rope}[4][] %
{ \pgfmathsetmacro{\RopeLevels}{25} %
\foreach \RopeLevel in {1,...,\RopeLevels} %
{ \pgfmathsetmacro{\RopeShade} %
{100 * (\RopeLevel-0.5) / \RopeLevels} %
\pgfmathsetlengthmacro{\RopeWidth} %
{sqrt(pow(#3, 2) - pow(#3 * (\RopeLevel-1) / \RopeLevels, 2))} %
\draw[#2!\RopeShade!black, line width=\RopeWidth, #1] #4; %
} %
} %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\begin{tikzpicture}
\Rope[rounded corners]{pink} {2mm}{ (0.0, 0.0) to (1.0, 1.0) to (0.0, 1.0) to (1.0, 0.0) }
\Rope[rounded corners]{white}{2mm}{ (1.5, 0.0) to (2.5, 1.0) to (2.0, 1.0) }
\Rope[rounded corners,shorten <=-0.2pt]{white}{2mm}{ (2.0, 1.0) to (1.5, 1.0) to (2.5, 0.0) }
\end{tikzpicture}
\end{document}

Mac의 미리보기에서 최대 확대 / 축소입니다. Acrobat Reader는 대부분의 확대에 대해 원활하지만 전부는 아닙니다.
원칙적으로 일부 오래된 경로를 잘라내어 "완벽한"결과를 얻을 수 있습니다. 다음은 dash pattern
.
\documentclass[tikz, border=2mm]{standalone}
%%% The "Rope" command %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
% \Rope[further options]{color}{width}{path definition} %
% %
\newcommand{\Rope}[4][]{% %
\pgfmathsetmacro{\RopeLevels}{25} %
\foreach \RopeLevel in {1,...,\RopeLevels} %
{ \pgfmathtruncatemacro{\RopeShade} %
{100 * (\RopeLevel-0.5) / \RopeLevels} %
\pgfmathsetlengthmacro{\RopeWidth} %
{sqrt(pow(#3, 2) - pow(#3 * (\RopeLevel-1) / \RopeLevels, 2))} %
\draw[#2!\RopeShade!black, line width=\RopeWidth, #1] #4; %
} %
} %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\begin{tikzpicture}
\Rope[rounded corners]{pink} {2mm}{ (0.0, 0.0) to (1.0, 1.0) to (0.0, 1.0) to (1.0, 0.0) }
\Rope[rounded corners]{white}{2mm}{ (1.5, 0.0) to (2.5, 1.0) to (1.5, 1.0) to (2.5, 0.0) }
\Rope[rounded corners,dash pattern=on 79.02pt off 80pt]{white}{2mm}{ (1.5, 0.0) to (2.5, 1.0) to (1.5, 1.0) to (2.5, 0.0) }
\end{tikzpicture}
\end{document}
이 사람은 임의의 배율 또는 뷰어 (난 단지 시험에 대한 결함을하지 않는 것 Preview
과 Acrobat Reader
). 하나를 계산할 수 79.02pt
있습니까? 예, 적어도이 경우에는. 그러나 더 깨끗한 방법은 이 게시물 을 사용 하는 것 입니다.