你好,乐于助人的社区
我正在尝试创建一个自定义节点,用于工业绘图,以象征中断的部分,如下所示:
这是我的 MWE:
\documentclass[tikz,border=5pt]{standalone}
\usepackage{tikz,esvect}
\usetikzlibrary{calc}
\tikzset{%
VueInterromp/.style={
rectangle,
draw=none,
minimum height=2cm,
minimum width=1cm,
inner sep=2pt,
append after command={
(\tikzlastnode.west) -- ($(\tikzlastnode.west)!0.5!(\tikzlastnode.east)+(-0.3,0)$) -- ++(75:1) -- ($(\tikzlastnode.west)!0.5!(\tikzlastnode.east)+(+0.3,0)+(75-180:1)$) -- ($(\tikzlastnode.west)!0.5!(\tikzlastnode.east)+(+0.3,0)$) -- (\tikzlastnode.east)
}
}
}
\begin{document}
\begin{tikzpicture}
\draw[blue,thick] (-3,0) -- (3,0) node[pos=0.3,VueInterromp] {};
\end{tikzpicture}
\end{document}
问题 1
结果是:
正如人们所料,该线出现在节点后面。我试过了fill=white
,它似乎不起作用,因为它覆盖了节点本身。
如果您有解决问题或改进我的代码的想法,我会听取。
谢谢。
问题2
我还注意到,如果线不是水平的,它就不起作用,sloped
也不会切断它,所以可能是我做的不对……
\draw[blue,thick] (-3,0) -- (0,3) node[pos=0.3,VueInterromp,sloped] {} ;
得到:
问题 3
更进一步:画几条线:
\draw[blue,thick] (-3,0) -- (0,0) node[pos=0.3,VueInterromp,sloped] {} -- ++(-1.5,-3) ;
得到:
你会看到,下一条线的绘制从节点后面一点开始,而不是像我希望的那样从线的末尾开始。有什么想法吗?
问题 3.5
看看循环做了什么:
\draw[blue,thick] (-3,0) -- (0,0) node[pos=0.5,VueInterromp,sloped] {} node[pos=1] {} -- ++(-1.5,-3) -- cycle;
给出:
任何贡献都值得赞赏。非常感谢。
答案1
定制 的风格就直接多了to path
。
VueInterromp 对自定义部分有 4 个步骤:
- 中心点的位置
- 部分的半宽/路径的长度(固定宽度也可以,但有点复杂)
- 外侧与路径之间的角度
- 外边长度
并且我们需要计算路径的斜率来获得外侧的斜率。
比例宽度
\documentclass[tikz,border=5pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\tikzset{
% #1 center pos, #2 half width/path width, #3 angle, #4 length
VueInterromp/.style n args={4}{to path={
let \p1 = (\tikztostart), \p2 = (\tikztotarget) in
let \n1 = {\x2 - \x1}, \n2 = {\y2 - \y1} in
\pgfextra{\pgfmathsetmacro{\diffx}{\n1 / 1cm}}
\pgfextra{\pgfmathsetmacro{\diffy}{\n2 / 1cm}}
let \n{sqrt} = {sqrt((\diffx)^2 + (\diffy)^2)},
\n{sign} = {\diffy > 0 ? 1 : (\diffy < 0 ? -1 : (\diffx > 0 ? 1 : -1))} in
let \n{ang} = {\n{sign} * acos(\diffx / \n{sqrt})} in
\foreach \pos in {#1} {
% left part
-- ($(\tikztostart)!\pos - #2!(\tikztotarget)$)
-- ++({\n{ang} + #3}:#4)
-- ($(\tikztostart)!\pos!(\tikztotarget)$)
% right part
-- ($(\tikztostart)!\pos + #2!(\tikztotarget) + ({\n{ang} + #3 + 180}:#4)$)
-- ($(\tikztostart)!\pos + #2!(\tikztotarget)$)
}
-- (\tikztotarget) \tikztonodes
}}
}
\begin{document}
\ExplSyntaxOn
\ExplSyntaxOff
\begin{tikzpicture}
\foreach \a [evaluate=\a as \x using \a / 14] in {1, ..., 12}{
\draw (0, 0) \pgfextra{\edef\temp{\x}}
to[VueInterromp={\temp}{.05}{70}{2mm}] ++({\a * 30}:3)
to[VueInterromp={.5}{.1}{60}{2mm}] ++({\a *30 - 90}:1); % use ++ instead of +
}
\draw (-5, -5) to[VueInterromp={.2, .5, .8}{.08}{70}{1cm}] (5, -5);
\end{tikzpicture}
\end{document}
固定宽度
\documentclass[tikz,border=5pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\tikzset{
% #1 center pos, #2 half width, #3 angle, #4 length
VueInterromp/.style n args={4}{to path={
let \p1 = (\tikztostart), \p2 = (\tikztotarget) in
let \n1 = {\x2 - \x1}, \n2 = {\y2 - \y1} in
\pgfextra{\pgfmathsetmacro{\diffx}{\n1 / 1cm}}
\pgfextra{\pgfmathsetmacro{\diffy}{\n2 / 1cm}}
let \n{sqrt} = {sqrt((\diffx)^2 + (\diffy)^2)},
\n{sign} = {\diffy > 0 ? 1 : (\diffy < 0 ? -1 : (\diffx > 0 ? 1 : -1))} in
let \n{ang} = {\n{sign} * acos(\diffx / \n{sqrt})} in
\foreach \pos in {#1} {
% left part
-- ($(\tikztostart)!\pos!(\tikztotarget) - (\n{ang}:#2)$)
-- ++({\n{ang} + #3}:#4)
-- ($(\tikztostart)!\pos!(\tikztotarget)$)
% right part
-- ($(\tikztostart)!\pos!(\tikztotarget) + (\n{ang}:#2) + ({\n{ang} + #3 + 180}:#4)$)
-- ($(\tikztostart)!\pos!(\tikztotarget) + (\n{ang}:#2)$)
}
-- (\tikztotarget) \tikztonodes
}}
}
\begin{document}
\begin{tikzpicture}
\foreach \a [evaluate=\a as \x using \a / 14] in {1, ..., 12}{
\draw (0, 0) \pgfextra{\edef\temp{\x}}
to[VueInterromp={\temp}{1.5mm}{70}{2mm}] ++({\a * 30}:3)
to[VueInterromp={.5}{.1}{60}{2mm}] ++({\a *30 - 90}:1); % use ++ instead of +
}
\draw (-5, -5) to[VueInterromp={.2, .5, .8}{.8cm}{70}{1cm}] (5, -5);
\end{tikzpicture}
\end{document}
更改日志
- 5.31-1改为
atan2
判断acos
路径的方向 - 5.31-2变更示例
- 6.1 添加for循环绘制多个vueinterromps