我正在尝试制作如下图像:
以下是我目前的做法:
\begin{tikzpicture}
\draw[color=black, line width=2pt, -latex] (-3,2.5) -- (0, 2.5) +(0,\rad) coordinate (center) (0,2.5) arc[start angle=270, delta angle=30, radius=\rad];
\foreach \a in {270, 280, 290}{
\draw[draw=blue,-latex,thick] (center) ++(\a:\rad) -- +(\a-180:1cm) node at +(\a-180:1.5cm) {$F_m$};
}
\end{tikzpicture}
其中 \rad 只是我定义的给定半径。目前,这会在“圆”的中心产生一个虚拟坐标。这也意味着 Tikz 会形成一个非常大的边框,其中有很多额外的空白,我正在尝试寻找一种可以消除这个虚拟变量或空白的解决方案。
答案1
我建议使用pic
s 来执行此操作,s 是 tikz 图片中的“小 tikz 图片”。注意:你应该绝不将一个 tikz 图片放在另一个 tikz 图片内。该pic
构造旨在避免这种情况。
在这里,我们将设计一个pic
从 向上指向的蓝色箭头形状的(0,0)
,其上方有一个包含标签的节点。制作 的命令tikzpicture
与 中的命令相同pic
。当我们将 放置pic
在直线或曲线上时,(0,0)
对应于线段上的位置。使用 选项sloped
,它将调整其坐标,使“向上”垂直于线段。
被pic
命名为perp
,并且可以在段上的任意位置使用以下用法调用
...to pic[pos=<pct>,sloped]{perp=<label text>}(x,y)
其中<pct>
是沿当前段的百分比,<label text>
以数学模式处理。
pic
在序言中用 定义。tikzset
我将长度设置为.7
cm,标签位于其上方 3mm 处(0,1)
(在垂直坐标系中)。
\documentclass{article}
\usepackage{tikz}
\tikzset{perp/.pic={\draw[blue,-latex,thick](0,0)--(0,.7);
\node[text=black, font=\scriptsize] at(0,1){$#1$};},
perp/.default={}}
\begin{document}
\begin{tikzpicture}
\draw[thick](0,0)to pic[sloped]{perp}(2,0)
to[out=0,in=-120] pic[pos=.3,sloped]{perp=F_m} pic[pos=.8,sloped]{perp=F_m}(4,1);
\end{tikzpicture}
\end{document}
请注意,要使用pic
,arc
您必须使用 arc 命令的“长格式”:
\draw[thick](0,0) arc[start angle=120,end angle=60,radius=2] pic[pos=.8,sloped]{perp=F_m};
答案2
在等待 tikz 支持时,这里有一个版本元帖子,展示有用的direction .. of
构造,它可以让您pair
表示沿路径在特定时间的方向。
lualatex
用...编译它
\documentclass[border=5mm]{standalone}
\usepackage{luamplib}
\begin{document}
\mplibtextextlabel{enable}
\begin{mplibcode}
beginfig(1);
path ramp;
ramp = origin -- 100 right {right}.. 300 right rotated 12;
for t = 0.9, 1.3, 1.7:
path a;
a = (origin -- 72 up)
rotated angle direction t of ramp
shifted point t of ramp;
drawarrow subpath(0, 0.8) of a withcolor 2/3 blue;
label("$F_m$", point 1 of a);
endfor
drawarrow ramp withpen pencircle scaled 1;
endfig;
\end{mplibcode}
\end{document}
答案3
这是一种渐近线方法。
unitsize(1cm);
path p=(0,0) .. controls (3,.5) and (5,-3) .. (8,2);
real[] t={.3,.45,.65,.8,.9};
string[] Lt={"$F_a$","$F_b$","$F_c$","$F_d$","$F_e$"};
for(int i=0; i<t.length; ++i){
pair M=point(p,t[i]); // before I was confusing with M=relpoint(p,t[i]);
pair Mn=rotate(90)*dir(p,t[i]);
draw(Label(Lt[i],EndPoint),M--M+.8Mn,blue,Arrow(TeXHead));
}
draw(p,magenta+1pt,Arrow);