我試圖定義一種樣式,to path
當我放置 時,會繪製一個“彎曲矩形”(流形表示)\draw (0,0) to[manifold] (5,3)
。
in
我透過在絕對座標系和相對座標系中指定角度out
並使用 繪製四個角落來手動製作形狀to
。 (MWE 中的第一個和第二個範例。)
to path
我可以使用序言中定義的樣式繪製矩形。我正在努力解決兩個問題,我認為我可以解決(1)但不知道該怎麼做(2):
- 如何自動將 SE 和 NW 角向中心移動,或(等效地)向 SW 和 NE 角移動 10%,如第一個範例所示。 (b 向 c 和 a 移動了一點)。我也許可以透過計算和一些
($(\tikztostart -| \tikztotarget)!0.9!(\tikztostart |- \tikztotarget)$)
魔法來做到這一點。 - 將 應用於的操作
out=x,in=y,relative
內部的路徑。我不知道該怎麼做。manifold/.style
path to
對於2.,我嘗試了在 中找到的東西tikzlibrarytopaths.code.tex
,其中egout
被定義為設定的TikZ 選項\def\tikz@to@out{#1}\tikz@to@switch@on
。將其放在不同的地方(目前在\pgfextra
in 中to path
)是行不通的。有人可以幫忙嗎?
微量元素
\documentclass[tikz]{standalone}
\makeatletter
\tikzset{manifold/.style={
to path={
\pgfextra{
\def\tikz@to@out{20}\tikz@to@switch@on
}
(\tikztostart) -- (\tikztostart -| \tikztotarget)
-- (\tikztotarget)
-- (\tikztostart |- \tikztotarget)
-- cycle
(\tikztotarget)
\tikztonodes
}
}}
\makeatother
\begin{document}
\begin{tikzpicture}[every node/.style={opacity=0.5,color=cyan}]
\draw[line width=0.5pt,dotted,red] (-1,-3) grid (5,7);
% base manifold: absolute in/out angles
\draw[thick] (0,0) node{a}
to[out=-10,in=170] (4,0.5) node{b}
to[out=70,in=-130] (5,3) node{c}
to[out=170,in=-10] (1,2.5) node{d}
to[out=-130,in=70] cycle;
% base manifold: relative in/out angles: all the same
\begin{scope}[shift={(0,-3)},out=-20,in=160,relative]
\draw (0,0) to (4,0.5) to (5,3) to (1,2.5) to cycle;
\end{scope}
% base manifold: to path style
\begin{scope}[shift={(0,3)}]
\draw[red] (0,0) to[manifold] (5,3);
\end{scope}
\end{tikzpicture}
\end{document}
答案1
完全重新實作並使用顯式貝塞爾曲線路徑,使用座標(作為參數傳遞,具有預設值)來確定曲線。希望評論能解釋一切。
\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{calc}
\tikzset{manifold/.style={to path={
% Create new coordinates to save typing
(\tikztostart) coordinate (@1)
(\tikztostart |- \tikztotarget) coordinate (@2)
(\tikztotarget) coordinate (@3)
(\tikztostart -| \tikztotarget) coordinate (@4)
% Get 'transformed' points
(@1) coordinate (@@1)
($(@2)!0.1!(@4)$) coordinate (@@2)
(@3) coordinate (@@3)
($(@4)!0.1!(@2)$) coordinate (@@4)
% Calculate \manifoldsize for scaling
let \p1=(@1),\p2=(@3),\n1={veclen(\x2-\x1,\y2-\y1)} in
\pgfextra{\edef\manifoldsize{\n1}}
% Use coordinate passed in as #1
let \p1=#1 in
%
(@@1) .. controls ++( \x1, \y1) and ++(-\x1,-\y1) ..
(@@2) .. controls ++( \x1,-\y1) and ++(-\x1, \y1) ..
(@@3) .. controls ++(-\x1,-\y1) and ++( \x1, \y1) ..
(@@4) .. controls ++(-\x1, \y1) and ++( \x1,-\y1) .. cycle (@@3)
}}, manifold/.default={(45:\manifoldsize/4)}}
\begin{document}
\begin{tikzpicture}[ultra thick, line join=round]
\draw [purple] (-2,-2) to [manifold] (5,4);
\draw [orange] (0,0) to [manifold] (3,2);
\end{tikzpicture}
\end{document}
答案2
不是我的具體問題的答案,而是一種不同的、不太TikZ'y的方法,透過使用一個簡單的巨集:
\newcommand\manifold[3][]{
\draw[every to/.style={out=-20,in=160,relative},#1] (#2)
to ($(#2 -| #3)!0.2!(#2 |- #3)$)
to (#3)
to ($(#2 -| #3)!0.8!(#2 |- #3)$)
to cycle;
}
並像\manifold[green,thick]{0,0}{4,3}
@Mark Wilbrow 使用的 Answer一樣使用它to path
,這是我的初衷。 :)