Gelombang Tunggal di Garis tikzcd
Saya mencoba membuat format untuk panah di tikzcd yang secara efektif merupakan tilde yang diregangkan:
Saya telah menggambar contoh ini menggunakan Opsi 1 dalam jawaban ini , tetapi saya harus menghitung secara manual panjang segmen ular yang benar.
Apakah ada cara untuk menghitungnya secara otomatis? Katakan misalnya:
arrows={decorate, decoration={snake, segment length=DISTANCE/2, amplitude=0.5mm}}
Jika tidak, apakah ada pendekatan alternatif?
Bantuan apa pun akan sangat dihargai.
Jawaban
Saya memiliki solusi parsial berdasarkan jawaban ini .
Saya telah menyalin makro pembantu mereka secara keseluruhan, bersama dengan sebagian besar paruh pertama definisi gaya mereka. Satu-satunya kode yang menjadi tanggung jawab saya adalah yang ada di bawah komentar "Draw the wave":
\makeatletter
% This helper macro finds the start and endpoints of a line between the source and target nodes and stores them in \sourcecoordinate and \targetcoordinate.
% #1 -- source node
% #2 -- target node
\def\findedgesourcetarget#1#2{
\let\sourcecoordinate\pgfutil@empty
\ifx\tikzcd@startanchor\pgfutil@empty % Check that the source doesn't have a specified anchor
\def\tempa{\pgfpointanchor{#1}{center}}% if so, start by taking the center of that coordinate
\else
\edef\tempa{\noexpand\pgfpointanchor{#1}{\expandafter\@gobble\tikzcd@startanchor}} % If it has an anchor, use that
\let\sourcecoordinate\tempa
\fi
\ifx\tikzcd@endanchor\pgfutil@empty % check that the target doesn't have a specified anchor
\def\tempb{\pgfpointshapeborder{#2}{\tempa}}% if so, our end point is the point on the boundary of node b that is in the direction of our initial start coordinate
\else
\edef\tempb{\noexpand\pgfpointanchor{#2}{\expandafter\@gobble\tikzcd@endanchor}}% If it has a specified anchor, use that
\fi
\let\targetcoordinate\tempb
\ifx\sourcecoordinate\pgfutil@empty%
\def\sourcecoordinate{\pgfpointshapeborder{#1}{\tempb}}%
\fi
}
\tikzset{wave/.style = {
-,
to path={\pgfextra{
\findedgesourcetarget{\tikzcd@ar@start}{\tikzcd@ar@target} % find endpoints
% Rotate coordinate system so that line goes in x direction
\ifx\tikzcd@startanchor\pgfutil@empty
\def\tikzcd@startanchor{.center}
\fi
\ifx\tikzcd@endanchor\pgfutil@empty
\def\tikzcd@endanchor{.center}
\fi
\pgfmathanglebetweenpoints{\pgfpointanchor{\tikzcd@ar@start}{\expandafter\@gobble\tikzcd@startanchor}}{\pgfpointanchor{\tikzcd@ar@target}{\expandafter\@gobble\tikzcd@endanchor}}
\pgftransformrotate{\pgfmathresult}
% Draw the wave
\newdimen\xdiff
\pgfextractx{\xdiff}{\pgfpointdiff{\sourcecoordinate}{\targetcoordinate}}
\newdimen\ydiff
\pgfextracty{\ydiff}{\pgfpointdiff{\sourcecoordinate}{\targetcoordinate}}
\newdimen\finalDist
\pgfmathparse{abs(veclen(\xdiff,\ydiff))*0.85}
\pgfmathsetlength\finalDist{\pgfmathresult pt}
\pgfmathsetlength\pgfdecorationsegmentlength{\finalDist}
\pgfmathparse{0.038*\finalDist+0.6}
\pgfmathsetlength\pgfdecorationsegmentamplitude{\pgfmathresult pt}
\pgfsetarrows{->}
\pgfpathmoveto{\sourcecoordinate}
\pgfpathsnaketo{snake}{\targetcoordinate}
\pgfusepath{stroke}
}}}}
\makeatother
Dengan menggunakan makro helper, saya mengambil poin yang akan digabungkan dan menghitung jarak di antara mereka. Saya kemudian menggunakan ini untuk menentukan amplitudo dan panjang segmen ular.
Konstanta yang saya gunakan dalam definisi ini tampak sewenang-wenang, saya menemukannya melalui percobaan dan peningkatan, tetapi saya akan mengerjakan pendekatan yang lebih ketat.
Kemudian
\begin{center}
Original method:
\begin{tikzcd}[arrows={decorate, decoration={snake,segment length=7.3mm, amplitude=0.5mm}}]
A \arrow[r,"",decorate=true] & B
\end{tikzcd}
\end{center}
\hspace{2cm}
\begin{center}
Custom style
\begin{tikzcd}
A \arrow[r, wave] & B & & \\
A \arrow[rr, wave] & & B & \\
A \arrow[rrr, wave] & & & B
\end{tikzcd}
\end{center}
memberi
Masalah utama saya saat ini adalah label di atas panah tidak lagi berfungsi. Saya akan mencoba memperbaiki ini, dan memperbarui jawaban ini jika saya bisa.
Jika ada yang memiliki pendekatan sederhana yang menghindari masalah seperti itu, harap beri tahu saya!