Tikzcd लाइन में सिंगल वेव
मैं tikzcd में तीर के लिए एक प्रारूप बनाने की कोशिश कर रहा हूँ जो प्रभावी रूप से एक फैला हुआ टिल्ड है:
मैंने इस उत्तर में विकल्प 1 का उपयोग करके इस उदाहरण को खींचा है , लेकिन मुझे साँप के लिए सही खंड की लंबाई की मैन्युअल रूप से गणना करनी पड़ी है।
क्या यह स्वचालित रूप से गणना करने का एक तरीका है? उदाहरण के लिए कहें:
arrows={decorate, decoration={snake, segment length=DISTANCE/2, amplitude=0.5mm}}
यदि नहीं, तो क्या कोई वैकल्पिक तरीका है?
कोई भी सहायताकाफी प्रशंसनीय होगी।
जवाब
मेरे पास इस उत्तर के आधार पर एक आंशिक समाधान है ।
मैंने उनके हेल्पर मैक्रो को उसकी संपूर्णता में कॉपी किया है, साथ ही उनकी शैली की पहली छमाही के अधिकांश भाग। एकमात्र कोड मैं इसके लिए ज़िम्मेदार हूं जो कि "लहर को ड्रा करें" टिप्पणी के नीचे है:
\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
सहायक मैक्रो का उपयोग करते हुए, मैं उन बिंदुओं को पुनः प्राप्त करता हूं जो जुड़ने के लिए और उनके बीच की दूरी की गणना करते हैं। मैं तब सांप के आयाम और खंड की लंबाई को परिभाषित करने के लिए इसका उपयोग करता हूं।
इन परिभाषाओं में मैं जिन स्थिरांक का उपयोग करता हूं, वे मनमाने ढंग से प्रकट होते हैं, मैंने उन्हें परीक्षण और सुधार के माध्यम से पाया, लेकिन मैं अधिक कठोर दृष्टिकोण पर काम करूंगा।
फिर
\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}
देता है
मेरा मुख्य मुद्दा वर्तमान में यह है कि तीर के ऊपर लेबल अब काम नहीं करते हैं। मैं इसे ठीक करने की कोशिश करूंगा, और अगर मैं कर सकता हूं तो इस उत्तर को अपडेट कर सकता हूं।
अगर किसी के पास एक सरल तरीका है जो इस तरह की समस्याओं से बचता है तो कृपया मुझे बताएं!