我正在尝试自动沿(大部分是直线)路径绘制填充图。下面是我想实现的一个简单示例:
\documentclass[border=2cm]{standalone}
\usepackage{tikz}
\usetikzlibrary{backgrounds}
\begin{document}
\begin{tikzpicture}[gridded,
every path/.style={thick, red ,fill, fill opacity=.5},
every plot/.style={smooth}]
\begin{scope}
\draw (0,1) -- plot[domain=0:5, shift={(0,1)}, rotate={atan(3/4)}] (\x,0.05*\x^2) -- (4,4) -- cycle;
\draw[black] (0,1) -- (4,4);
\end{scope}
\begin{scope}[xshift=5cm]
\draw (0,3) -- plot[domain=0:sqrt(17), shift={(0,3)}, rotate={atan(-1/4)}] (\x,{0.5*sin(3*\x r)}) -- (4,2) -- cycle;
\draw[black] (0,3) -- (4,2);
\end{scope}
\end{tikzpicture}
\end{document}
但是我怎样才能使这个过程自动化(也许对于弯曲的路径也是如此?)我怎样才能
- 将图移动到最后一个坐标(我尝试使用 \pgfextractxy,但无法使其工作)
- 旋转它(使用 atan() 效果很好,但垂直路径怎么办?)
- 将域设置为路径的长度(尝试使用 let 选项和 veclen 命令,但出现“尺寸太大”错误)
- 将其实施,以便我可以重复多次(例如
\draw (A) -- plot[on path] (\x, <function>) -- (B)
)
任何想法都值得赞赏!
编辑
看来我的意图不太明确:目前,我很乐意只提供直线路径的解决方案。(不过,如果有曲线路径的选项就更好了)所以我的目标是有一个简单的方法在画布上的两个给定点之间绘制一个函数,而不必每次都重新计算我的旋转、平移和域。
答案1
这是沿着直线绘制的。
\documentclass[tikz,border=3.14mm]{standalone}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}[%gridded,
every path/.style={thick, red ,fill, fill opacity=.5},
every plot/.style={smooth},
plot along line/.style args={from #1 to #2}{insert
path={
let \p1=($#2-#1$),\n1={veclen(\x1,\y1)/1cm},\n2={atan2(\y1,\x1)}
in [shift={#1},rotate=\n2,domain=0:\n1]
}}]
\begin{scope}
\draw {[plot along line=from {(0,1)} to {(4,4)}]
plot (\x,0.05*\x^2) }-- (4,4) -- cycle;
\draw[black] (0,1) -- (4,4);
\end{scope}
\begin{scope}[xshift=5cm]
\draw[plot along line=from {(0,3)} to {(4,2)}] plot (\x,{0.5*sin(3*\x r)})
coordinate (end) --cycle;
\draw[black] (0,3) -- (end);
\end{scope}
\end{tikzpicture}
\end{document}
您还可以使用 添加沿曲线坐标系绘图的样式\usepgfmodule{nonlineartransformations} \usepgflibrary{curvilinear}
。
\documentclass[tikz,border=3.14mm]{standalone}
\usetikzlibrary{calc}
\usepgfmodule{nonlineartransformations}
\usepgflibrary{curvilinear}
\begin{document}
\begin{tikzpicture}
\draw [help lines] (0,0) grid (3,2);
{
\pgfsetcurvilinearbeziercurve
{\pgfpoint{0mm}{20mm}}
{\pgfpoint{11mm}{20mm}}
{\pgfpoint{20mm}{11mm}}
{\pgfpoint{20mm}{0mm}}
\makeatletter
\pgftransformnonlinear{\pgfpointcurvilinearbezierorthogonal\pgf@x\pgf@y}%
\makeatother
\draw (0,-30pt) grid [step=10pt] (80pt,30pt);
\draw[blue,thick] plot[domain=0:2.8,samples=51] ({\x},{sin(180*\x)});
}
\draw[red, very thick]
(0mm,20mm) .. controls (11mm,20mm) and (20mm,11mm) .. (20mm,0mm);
\end{tikzpicture}
\end{document}
这个例子大致取自 pgfmanual,只是我添加了一个函数图。但是,我不知道你到底想做什么?你如何指定坐标系?