我正在尝试绘制两条loosely dotted
线,一条斜率为 0(即水平线),另一条向上倾斜。有没有办法水平对齐这两条线上的点?
这是 MWE。基本上,我想要的是让每条线上的第 n 个点对齐,以便您可以绘制一条穿过它们的垂直直线。这是我绘制两个域为离散集的函数的尝试。
\documentclass[english,12pt]{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\draw[loosely dotted,very thick](0,2)--(5,2);
\draw[loosely dotted,very thick](0,0)--(5,5);
\draw[<->,>=latex](0,6)node[left]{$y$}--(0,0)--(6,0)node[below]{$x$};
\end{tikzpicture}
\end{document}
答案1
在这种特殊情况下,可以做到这一点,如上图所示,但我猜你想要一个更通用的解决方案,如果要绘制的线是一般曲线,那么这种解决方案就不存在。
对于直线的情况,诀窍是定义一个“点状图案”,并在点之间留出适当的间隔。在这个特殊情况下,我对水平线使用了 5pt 的间隔(1pt“开”,4pt“关”)。由于对角线为 45 度,所需的间隔必须是 5*sqrt(2),或者一般为 5*tan(角度)。这导致 1pt“开”,6.071“关”,因此点之间的距离为 7.071(5*sqrt(2))。
产生上图的代码是:
\tikzset{
horizontal dotted/.style = {
dash pattern = on 1pt off 4pt,
line width =0.8pt
},
diagonal dotted/.style = {
dash pattern = on 1pt off 6.071pt,
line width =0.8pt
}
}
\begin{tikzpicture}[line cap=square]
\draw[horizontal dotted](0,2)--(5,2);
\draw[diagonal dotted](0,0)--(5,5);
\draw[<->,>=latex](0,6)node[left]{$y$}--(0,0)--(6,0)node[below]{$x$};
\foreach \x in {0,5,...,140} {
\draw[very thin, help lines] (\x pt + 0.5pt, 0pt) -- +(0,5);
}
\end{tikzpicture}
请注意,经过一些努力,此解决方案可以推广到直线,以便可以根据对角线的起点和终点计算对角线中点之间的所需距离。但由于我不知道实际用例,所以我不知道这种努力是否值得。
更新
一种不同的方法,可能更通用。非常黑客化!
现在的诀窍是定义一个“填充图案”,该图案由给定宽度(我使用了 1pt)并间隔给定距离(我使用了 2mm)的垂直条纹(填充矩形)组成。然后,使用该填充图案绘制线条。这应该可行,因为图案以某种方式绘制在图形“后面”,并且填充区域只是允许看到图案的“孔”,因此对于使用该图案的所有填充区域,这些条纹将“同相”。
当然,问题在于填充图案不能应用于线条,只能应用于封闭的形状,所以我不得不发明另一种方法,将要绘制的线条转换为可以用这种方式填充的矩形。我认为最简单的方法是使用在线两端之间生成的倾斜矩形节点。
这是完整的代码。我允许指定填充图案的颜色,它转换为“点”的颜色:
\usetikzlibrary{calc,patterns}
\pgfdeclarepatternformonly{stripes}
{\pgforigin}{\pgfpoint{1cm}{2cm}}
{\pgfpoint{2mm}{1cm}} % Change 2mm for the required distance among "dots"
{
\pgfpathmoveto{\pgfpoint{0}{0}}
\pgfpathlineto{\pgfpoint{1pt}{0}} % Change 1pt for the desired width of the "dots"
\pgfpathlineto{\pgfpoint{1pt}{1cm}}
\pgfpathlineto{\pgfpoint{0}{1cm}}
\pgfpathclose%
\pgfusepath{fill}
}
\tikzset{
trick/.style = {
midway, draw=none, minimum height=.8pt,
inner sep=0pt,sloped,
pattern = stripes, pattern color= #1,
},
trick/.default = {black},
}
\newcommand{\linedraw}[3][black]{
\path let
\p1=($(#3)-(#2)$),
\n1={veclen(\p1)}
in (#2) -- (#3) node[trick=#1, minimum width=\n1] {};
}
\begin{tikzpicture}[line cap=square]
\linedraw{0,2}{5,2};
\linedraw{0,0}{5,5};
\linedraw[red]{1,4}{4.5,0};
\draw[<->,>=latex](0,6)node[left]{$y$}--(0,0)--(6,0)node[below]{$x$};
\foreach \x in {1,3,...,50} {
\draw[very thin, help lines] (\x mm + 0.5pt, 0) -- +(0,5);
}
\end{tikzpicture}
结果如下:
答案2
受到 JLDiaz 的使用启发foreach
,我想出了以下尝试,它允许绘制简单的非线性函数。我必须删除 0 处的点以避免被零除。
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\foreach \x in {5,10,...,140}{
\draw[very thin, help lines] (\x pt, 0pt) -- +(0,5);
\draw[fill=black]
(\x pt,1)circle(.5pt)
(\x pt,\x pt)circle(.5pt)
;
\draw[red,fill=red](\x pt,25/\x)circle(.5pt); % y=25/x
\draw[blue,fill=blue](\x pt,\x^.3)circle(.5pt); % y=x^{0.3}
}
\draw[<->,>=latex](0,6)node[left]{$y$}--(0,0)--(6,0)node[below]{$x$};
\end{tikzpicture}
\end{document}