![如何在 tikz 中将一个片段分成 n 个相等的部分](https://linux22.com/image/325271/%E5%A6%82%E4%BD%95%E5%9C%A8%20tikz%20%E4%B8%AD%E5%B0%86%E4%B8%80%E4%B8%AA%E7%89%87%E6%AE%B5%E5%88%86%E6%88%90%20n%20%E4%B8%AA%E7%9B%B8%E7%AD%89%E7%9A%84%E9%83%A8%E5%88%86.png)
我想将一个向量分成 n 部分。但我想在 tikz 中执行此操作。几年前,我在 CorelDraw 中绘制了绘图,结果是这样的:
现在我想用以下代码在 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}
结果是:
但我想将线段 [AB] 分成 n 部分。
谢谢。
(我已经看过了如何使用 PSTricks 将一条线或曲线分成 n 个相等的部分并勾选并且我找不到那里的答案,因为它在 pstricks 中而我更喜欢 tikz。)
答案1
由于您正在使用tkz-euclide
,您可以使用它来计算通过命令的路径的长度\tkzCalcLength(A,B)
并将其存储在变量中\tkzGetLength{ABl}
。
\ticknum
然后,我们可以设置要将路径分割成的“段”数(用),通过简单的计算,我们可以将路径平均分成这些段。最后,我们可以使用在路径上的指定点\tkzMarkSegment[pos=\myl, mark=|](A,B)
放置标记。|
要改变段数,只需改变的值\ticknum
。
输出
代码
\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}
代码将 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}
答案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.
它应该适用于任意路径。