如何在 tikz 中将一个片段分成 n 个相等的部分

如何在 tikz 中将一个片段分成 n 个相等的部分

我想将一个向量分成 n 部分。但我想在 tikz 中执行此操作。几年前,我在 CorelDraw 中绘制了绘图,结果是这样的: enter image description here

现在我想用以下代码在 tikz 中制作它:

\documentclass{article}
\usepackage{amsmath} %voor wiskundige formules
\usepackage{pgf,tikz}
\usetikzlibrary{arrows, decorations.pathmorphing, calc,intersections,through,backgrounds,snakes,patterns} 
\usepackage{tkz-euclide}
\usetkzobj{all}
\usepackage{pgfplots}
\pgfplotsset{compat=1.8}
\usetikzlibrary{fit,arrows.meta}

\begin{document}

\begin{center}
\begin{tikzpicture}
\tkzInit[ymax=5,xmax=5]
\tkzDefPoints{1/1/A, 4/4/B};
\tkzClip
%\tkzGrid
\draw[Circle-stealth] (A) -- (B);
\node[right] at (A) {\tiny aangrijpingspunt};
\end{tikzpicture}
\end{center}
\end{document}

结果是:

enter image description here

但我想将线段 [AB] 分成 n 部分。

谢谢。

(我已经看过了如何使用 PSTricks 将一条线或曲线分成 n 个相等的部分并勾选并且我找不到那里的答案,因为它在 pstricks 中而我更喜欢 tikz。)

答案1

由于您正在使用tkz-euclide,您可以使用它来计算通过命令的路径的长度\tkzCalcLength(A,B)并将其存储在变量中\tkzGetLength{ABl}

\ticknum然后,我们可以设置要将路径分割成的“段”数(用),通过简单的计算,我们可以将路径平均分成这些段。最后,我们可以使用在路径上的指定点\tkzMarkSegment[pos=\myl, mark=|](A,B)放置标记。|

要改变段数,只需改变的值\ticknum

输出

output

代码

\documentclass[margin=10pt]{standalone}
\usepackage{amsmath} %voor wiskundige formules
\usepackage{pgf,tikz}
\usepackage{tkz-euclide}
\usetkzobj{all}
\usepackage{pgfplots}

\pgfplotsset{compat=1.8}
\usetikzlibrary{arrows, decorations.pathmorphing, calc,intersections,through,backgrounds,patterns,fit,arrows.meta}

\newcommand{\ticknum}{10}
\pgfmathsetmacro\min{\ticknum-1}

\begin{document}
\begin{tikzpicture}
\tkzInit[ymax=5,xmax=5]
\tkzDefPoints{1/1/A, 4/4/B};
\tkzClip
%\tkzGrid
\draw[Circle-stealth] (A) -- (B);
\node[right] at (A) {\tiny aangrijpingspunt};

\tkzCalcLength(A,B)\tkzGetLength{ABl} % calculates and stores length

\foreach \x in {1,...,\min}{
    \pgfmathsetmacro\myl{((\ABl/\ticknum)/\ABl)*\x}
    \tkzMarkSegment[pos=\myl, mark=|](A,B)
}
\end{tikzpicture}
\end{document}

答案2

一种解决方案是执行路径计算:

\documentclass[tikz]{standalone}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{tikz}
\usetikzlibrary{calc, arrows}

\newcommand\customticknum{4}   % Divides into \ticknum equal parts
\newcommand\customticklen{1em} % Defines the length of a tick
\begin{document}
\pagestyle{empty}
\begin{tikzpicture}[auto]
    \node[shape=coordinate] (A) at (0,0){};
    \node[shape=coordinate] (B) at (3,3){};
    \draw[*-*](A) -- (B);
    \pgfmathparse{\customticknum-1}
    \foreach \i in {1,...,\pgfmathresult}
        \draw let \p1=($(B)-(A)$), \n1={veclen(\x1, \y1)}  in ($(A)!\i*(\n1)/(\customticknum)!(B)!0.5*\customticklen!90:(B)$) -- ($(A)!\i*(\n1)/(\customticknum)!(B)!0.5*\customticklen!-90:(B)$);
\end{tikzpicture}
\end{document}

输出: enter image description here

代码将 A 和 B 之间绘制的线分成\customticknum相等的部分。可以使用 自定义刻度线本身的长度\customticklen。我相信一定有更简单的方法,但我无法提供。谢谢,希望对您有所帮助。

解释:关键是 和 执行的路径计算($(A)!\i*(\n1)/(\customticknum)!(B)!0.5*\customticklen!90:(B)$)($(A)!\i*(\n1)/(\customticknum)!(B)!0.5*\customticklen!-90:(B)$)第一部分 '($(A)!\i*(\n1)/(\customticknum)!(B)' 用于在点 A 和 B 之间找到正确的点。第二部分将!0.5*\customticklen!90:(B)$)点垂直于线 AB 移动 cutomticknumlen 的一半(由于坐标 B 之前的 90 度)。此计算一次以 90 度执行,一次以 -90 度执行。

编辑:现在分成 customticknum 等份

答案3

另一种可能的方法是使用decorations.markings库,它允许在路径上放置任意标记。使用箭头可以轻松绘制箭头上的刻度|

我认为代码是不言自明的:使用常用命令绘制箭头\draw,然后|使用 将箭头放置在指定位置decoration={...}

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{arrows} 
\usetikzlibrary{decorations.markings}

\begin{document}
\begin{tikzpicture}

\draw[ *->,
        decoration={markings,
            mark= at position 0.2 with {\arrow{|}},
            mark= at position 0.4 with {\arrow{|}},
            mark= at position 0.6 with {\arrow{|}},
            mark= at position 0.8 with {\arrow{|}},
        },
        postaction={decorate}
    ]
    (1,1) node[anchor=west] {aangrijpingspunt} -- (4,4);

\end{tikzpicture}
\end{document}

result

答案4

只是为了比较,这里有一个在普通的 Metapost 中执行此操作的函数。

prologues := 3;
outputtemplate := "%j%c.eps";

vardef draw_n_marks_along(expr P, N) text _t = 
  save a, dt; 
  dt = arclength P / (N+1);
  for i=1 upto N:
    a := arctime dt*i of P;   
    draw (down--up) scaled 2 
                    rotated angle direction a of P
                    shifted point a of P _t;
  endfor
enddef;
beginfig(1);

path a, b;

a = origin -- (120,40);
b = (0,30) .. (80, 60) .. (120,50);

draw_n_marks_along(a,3);
draw_n_marks_along(b,12) withcolor blue;

drawarrow a; 
drawarrow b;

endfig;
end.

它应该适用于任意路径。

enter image description here

相关内容