更新

更新

我正在尝试绘制两条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}

在离散域上绘制函数

相关内容