围绕平行四边形进行裁剪

围绕平行四边形进行裁剪

为了说明二维空间中线性组合的概念,我制作了一个基于两个线性独立向量的非矩形坐标系的讲义。我使用了一系列平行线来实现这一点。我想剪裁该图以仅显示线实际相交的区域。该区域的边界是平行四边形。我该怎么做呢?我可以手动调整每条线的域,但这会非常繁琐。此外,如果您有更优雅的方法来实现我的总体目标,请分享。

\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{center}
    \begin{tikzpicture}[scale=1.0,x=1.0cm,y=1.0cm,>=latex,font=\footnotesize]
        \draw[-,thin,dashed,samples=100,domain=-5:5] plot (\x,{(\x)-5});
        \draw[-,thin,dashed,samples=100,domain=-5:5] plot (\x,{(\x)-4});
        \draw[-,thin,dashed,samples=100,domain=-5:5] plot (\x,{(\x)-3});
        \draw[-,thin,dashed,samples=100,domain=-5:5] plot (\x,{(\x)-2});
        \draw[-,thin,dashed,samples=100,domain=-5:5] plot (\x,{(\x)-1});
        \draw[-,thin,dashed,samples=100,domain=-5:5] plot (\x,{(\x)});
        \draw[-,thin,dashed,samples=100,domain=-5:5] plot (\x,{(\x)+1});
        \draw[-,thin,dashed,samples=100,domain=-5:5] plot (\x,{(\x)+2});
        \draw[-,thin,dashed,samples=100,domain=-5:5] plot (\x,{(\x)+3});
        \draw[-,thin,dashed,samples=100,domain=-5:5] plot (\x,{(\x)+4});
        \draw[-,thin,dashed,samples=100,domain=-5:5] plot (\x,{(\x)+5});
        \draw[-,thin,dashed,samples=100,domain=-5:5] plot (\x,{(-1/2)*(\x)-5});
        \draw[-,thin,dashed,samples=100,domain=-5:5] plot (\x,{(-1/2)*(\x)-4});
        \draw[-,thin,dashed,samples=100,domain=-5:5] plot (\x,{(-1/2)*(\x)-3});
        \draw[-,thin,dashed,samples=100,domain=-5:5] plot (\x,{(-1/2)*(\x)-2});
        \draw[-,thin,dashed,samples=100,domain=-5:5] plot (\x,{(-1/2)*(\x)-1});
        \draw[-,thin,dashed,samples=100,domain=-5:5] plot (\x,{(-1/2)*(\x)});
        \draw[-,thin,dashed,samples=100,domain=-5:5] plot (\x,{(-1/2)*(\x)+1});
        \draw[-,thin,dashed,samples=100,domain=-5:5] plot (\x,{(-1/2)*(\x)+2});
        \draw[-,thin,dashed,samples=100,domain=-5:5] plot (\x,{(-1/2)*(\x)+3});
        \draw[-,thin,dashed,samples=100,domain=-5:5] plot (\x,{(-1/2)*(\x)+4});
        \draw[-,thin,dashed,samples=100,domain=-5:5] plot (\x,{(-1/2)*(\x)+5});
        \draw[->,very thick] (0,0) -- (.666,.666) node[above left] {$\mathbf{u}$};
        \draw[->,very thick] (0,0) -- (.666,-.333) node[below ] {$\mathbf{v}$};
    \end{tikzpicture}
\end{center}
\end{document}

答案1

TikZ 还支持不同的坐标系。方向向量X(和)可以通过坐标系的向量明确设置xy canvas

x={(1cm, 1cm)},
y={(1cm, -.5cm)},

然后网格线和矢量线可以通过 uv(=xy)坐标系的简单整数指定。根本不需要裁剪。

例子:

\documentclass{article}
\usepackage{tikz}
\begin{document}
  \begin{center}
    \begin{tikzpicture}[
      >=latex,
      % font=\footnotesize,
      x={(1cm, 1cm)},
      y={(1cm, -.5cm)},
    ]
      \def\xmin{-2}
      \def\xmax{3}
      \def\ymin{-2}
      \def\ymax{3}
      \draw[thin, dashed]
        \foreach \x in {\xmin, ..., \xmax} {
          (\x, \ymin) -- (\x, \ymax)
        }
        \foreach \y in {\ymin, ..., \ymax} {
          (\xmin, \y) -- (\xmax, \y)
        }
      ;
      \draw[<->, very thick]
        (1, 0) node[above left] {$\mathbf{u}$}
        -- (0, 0)
        -- (0, 1) node[below] {$\mathbf{v}$}
      ;
    \end{tikzpicture}
  \end{center}
\end{document}

结果

答案2

像这样?

剪辑到平行四边形

您可以使用\clip <path specification>;指定要剪辑其范围内的所有内容的区域。在这里,图片中的其他所有内容都在剪辑范围内,因为这只是用作环境中的第一步tikzpicture

如果我理解正确的话,你想要的是类似这样的东西:

    \clip  (0,-5) -- +(-5,2.5) -- (-5,0) -- (0,5) -- (5,2.5)  -- (5,0) -- cycle;

这不是平行四边形,因为原始图中没有画出两个角。显然,您可以根据需要进行调整。

您还可以使用循环更简洁地指定绘图。在这里,内循环遍历\i-5到的值5,外循环遍历\j两个值1.5。这将现有绘图的代码简化为

    \foreach \j in {1,-.5}
      \foreach \i in {-5,...,5}
        \draw[-,thin,dashed,samples=100,domain=-5:5] plot (\x,{\j*(\x)+\i});;

通过剪辑以及使用两个命令创建箭头,图像就完成了。

完整代码:

\documentclass[tikz,border=10pt]{standalone}
\begin{document}
  \begin{tikzpicture}[scale=1.0,x=1.0cm,y=1.0cm,>=latex,font=\footnotesize]
    \clip  (0,-5) -- +(-5,2.5) -- (-5,0) -- (0,5) -- (5,2.5)  -- (5,0) -- cycle;
    \foreach \j in {1,-.5}
      \foreach \i in {-5,...,5}
        \draw[-,thin,dashed,samples=100,domain=-5:5] plot (\x,{\j*(\x)+\i});;
    \draw[->,very thick] (0,0) -- (.666,.666) node[above left] {$\mathbf{u}$};
    \draw[->,very thick] (0,0) -- (.666,-.333) node[below] {$\mathbf{v}$};
  \end{tikzpicture}
\end{document}

答案3

这就是您想要实现的目标吗?

\documentclass{article}
\usepackage{tikz}

\begin{document}

\begin{center}
    \begin{tikzpicture}[scale=1.0,x=1.0cm,y=1.0cm,>=latex,font=\footnotesize]
        \clip
          (0,-5) -- (5,0) -- (5,2.5) -- (0,5) -- (-5,0) -- (-5,-2.5) -- cycle;
        \foreach \Value in {-5,...,5}
          {
            \draw[-,thin,dashed,domain=-5:5] plot (\x,{(\x)+\Value});
            \draw[-,thin,dashed,domain=-5:5] plot (\x,{(-1/2)*(\x)+\Value});
          }  
        \draw[->,very thick] (0,0) -- (.666,.666) node[above left] {$\mathbf{u}$};
        \draw[->,very thick] (0,0) -- (.666,-.333) node[below ] {$\mathbf{v}$};
    \end{tikzpicture}
\end{center}

\end{document}

在此处输入图片描述

请注意,使用 可以\foreach大大简化代码。另外,由于您绘制的是直线,因此不需要添加太多内容samples=100(除了会使编译时间更长)。

如果想得到真正的平行四边形,修改很简单:

\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{center}
    \begin{tikzpicture}[scale=1.0,x=1.0cm,y=1.0cm,>=latex,font=\footnotesize]
        \clip
          (0,-3) -- (4.66666,1.66666) -- (0,4) -- (-4.66666,-0.66666) -- cycle;
        \foreach \Value in {-3,...,4}
          {
            \draw[-,thin,dashed,domain=-5:5] plot (\x,{(\x)+\Value});
            \draw[-,thin,dashed,domain=-5:5] plot (\x,{(-1/2)*(\x)+\Value});
          }  
        \draw[->,very thick] (-0.66666,0.33333) -- ++(0.666,.666) node[above left] {$\mathbf{u}$};
        \draw[->,very thick] (-0.66666,0.33333) -- ++(.666,-.333) node[below ] {$\mathbf{v}$};
    \end{tikzpicture}
\end{center}
\end{document}

在此处输入图片描述

相关内容