在 tikz-pgf 中绘制垂直线至曲线路径,无任何修饰

在 tikz-pgf 中绘制垂直线至曲线路径,无任何修饰

我正在尝试制作如下图像:

在此处输入图片描述

以下是我目前的做法:

\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

我建议使用pics 来执行此操作,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我将长度设置为.7cm,标签位于其上方 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}

请注意,要使用picarc您必须使用 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);

相关内容