使用 TikZ 在 3D 网格上表示一般变换

使用 TikZ 在 3D 网格上表示一般变换

我有一个由单位正方形构成的长方体,在二维中看起来像这样:

长方体的二维版本

考虑一下它的 3D 版本(即长方体)。我想使用 Tikz 来演示我们可以引入到这个 3D 网格中的一些可能的变形。我想展示任意拉伸(在任意方向上)、剪切(其中一半被拉向一个方向,另一半被拉向另一个方向)和一些一般的不均匀变形(无法通过任何旋转、剪切、拉伸等描述的变形。这是一种非常普遍的变换)。

我希望每个球体都有不同的阴影,并且以不同的颜色显示不同的变换。

提前非常感谢您的帮助!

答案1

这不是您问题的完整答案(即,这是我在这个社区中针对 tikz 的第一个答案。:))但是,一旦您绘制了形状,就需要将每个顶点与变换矩阵相乘。我修改了这个代码并添加球体。结果是

在此处输入图片描述

对于绕 z 轴旋转,这是结果(即旋转顺序 zyz,但你可以更改它,请参阅此链接

在此处输入图片描述

其他变换很简单。只需定义一个变量,并用立方体的顶点击中它即可。

\documentclass{article}
\usepackage[table,dvipsnames]{xcolor}
\usepackage{tikz}  
\usepackage{tikz-3dplot} 
\usepackage{amssymb}
\usepackage{xifthen}



\tdplotsetmaincoords{60}{125}
\tdplotsetrotatedcoords{0}{0}{0} %<- rotate around (z,y,z)
\begin{document}

\begin{tikzpicture}[scale=3,tdplot_rotated_coords,
                    cube/.style={very thick,black},
                    grid/.style={very thin,gray},
                    axis/.style={->,blue,ultra thick},
                    rotated axis/.style={->,purple,ultra thick}]

    %draw a grid in the x-y plane
    \foreach \x in {-0.5,0,...,2.5}
        \foreach \y in {-0.5,0,...,2.5}
        {
            \draw[grid] (\x,-0.5) -- (\x,2.5);
            \draw[grid] (-0.5,\y) -- (2.5,\y);
        }

    %draw the main coordinate frame axes
    \draw[axis,tdplot_main_coords] (0,0,0) -- (3.5,0,0) node[anchor=west]{$x$};
    \draw[axis,tdplot_main_coords] (0,0,0) -- (0,3.5,0) node[anchor=north west]{$y$};
    \draw[axis,tdplot_main_coords] (0,0,0) -- (0,0,3.5) node[anchor=west]{$z$};


    %draw the rotated coordinate frame axes
    \draw[rotated axis] (0,0,0) -- (3,0,0) node[anchor=west]{$x'$};
    \draw[rotated axis] (0,0,0) -- (0,3,0) node[anchor=south west]{$y'$};
    \draw[rotated axis] (0,0,0) -- (0,0,3) node[anchor=west]{$z'$};

    %draw the top and bottom of the cube
    \draw[cube,fill=blue!5] (0,0,0) -- (0,2,0) -- (2,2,0) -- (2,0,0) -- cycle;

    %draw the top and bottom of the cube
    \draw[cube,fill=red!5] (0,0,0) -- (0,2,0) -- (0,2,2) -- (0,0,2) -- cycle;

    %draw the top and bottom of the cube
    \draw[cube,fill=green!5] (0,0,0) -- (2,0,0) -- (2,0,2) -- (0,0,2) -- cycle;

\foreach \x in {0,1,2}
   \foreach \y in {0,1,2}
      \foreach \z in {0,1,2}{
           %#####################################################
           \ifthenelse{  \lengthtest{\x pt < 2pt}  }
           {
             % True
                \draw [black]   (\x,\y,\z) -- (\x+1,\y,\z);
           }
           {% False
           }
           %#####################################################
           \ifthenelse{  \lengthtest{\y pt < 2pt}  }
           {
             % True
                \draw [black]   (\x,\y,\z) -- (\x,\y+1,\z);
           }
           {% False
           }
           %#####################################################
           \ifthenelse{  \lengthtest{\z pt < 2pt}  }
           {
             % True
                \draw [black]   (\x,\y,\z) -- (\x,\y,\z+1);
           }
           {% False
           }
           \shade[rotated axis,ball color = purple!80] (\x,\y,\z) circle (0.06cm);          
}

\end{tikzpicture}



\end{document}

答案2

tikz 的特点是,由于它具有很强的可塑性,您可以从多个示例中选取一些并制作自己的示例。

以下是您可能需要寻找的一些示例(拉伸之前):

一个长方体:http://www.texample.net/tikz/examples/cuboid/

交换图:http://www.texample.net/tikz/examples/commutative-diagram/

剩下的就是调整基础代码

一个简单的 3D 图形:http://www.texample.net/tikz/examples/3d-graph-model/

还有很多其他的例子:http://www.texample.net/tikz/examples/all/

如果你想查看内部内容,请点击下载为[TEX]

我认为拉伸部分是点放置的问题

相关内容