在 TikZ 中为绘图定义不同的平面

在 TikZ 中为绘图定义不同的平面

我想在 TikZ 中的不同平面上绘制图形。考虑在 z=0 处的 xy 平面上绘制一个简单的矩形,在 z=2 处的 xy 平面上绘制另一个矩形的示例。通常,我考虑的平面除了从原点的位移外,还会包括一些旋转(详情见下文)O。我见过这种情况邮政它使用不同的画布,但我不确定如何适应它。

我希望使用允许我移动和旋转平面的示波器环境。这样,在该示波器内绘制的任何图形都会出现在该平面内。

此处考虑的轮换细节 这里提到的旋转是沿着轴的旋转x,y,z。例如,假设我有两个平面:一个平面的原点O = (0,0,0)在左下角,另一个平面的原点在O' = (2,0,0)。平面 2 的旋转是沿着与点相交的轴的旋转O

以下是设置基本问题的 MWE:

\documentclass{standalone}

\usepackage{tikz} 
\usepackage{tikz-3dplot} 
\usetikzlibrary{arrows.meta}

\begin{document} 
\tdplotsetmaincoords{60}{130}

\begin{tikzpicture}[scale=2,tdplot_main_coords]

\draw[thick,->] (0,0,0) -- (5,0,0) node[right]{$x$}; 
\draw[thick,->] (0,0,0) -- (0,5,0) node[above]{$y$}; 
\draw[thick,->] (0,0,0) -- (0,0,5) node[below left]{$z$};

%Circle in xy plane at z=0 
\filldraw[fill=blue!40!white, draw=black] (0,0,0) rectangle (4,4,0);

%Another circle at xy plane at z=2 
%\filldraw[fill=blue!40!white, draw=black] (0,0) rectangle (4,4);

\end{tikzpicture} 
\end{document}

答案1

为了旋转和移动,你只需要以下答案之一这个问题用于旋转,并添加移位。据我所知,这两个答案都很好。

但是,有人可能想换一种方法。其中一个答案不允许用户累积变换。另一个答案可以做到这一点,但代价是跟踪旋转矩阵。只要用户不通过其他方式添加进一步的变换,这种方法就可以正常工作。因此,这里有第三种方法,其中使用当前基向量来允许用户堆叠变换。引入的键是rotate about x axis等。至关重要的是,它们不依赖于tikz-3dplot,如果您使用库13d view的,它们也会起作用。这些准备工作允许您执行类似perspective

\begin{scope}[rotate about x axis=-20,canvas is xy plane at z=0,
shift={(O')}]
%Circle in transformed xy plane at z=0 
\path[fill=red!40!white, draw=black] circle[radius=1cm];
\end{scope}

完整代码:

\documentclass[tikz,border=3mm]{standalone}
\usepackage{tikz-3dplot} 
\usetikzlibrary{arrows.meta}
\makeatletter
\def\tikz@td@retrieve@current@basis{%
\pgfmathsetmacro{\tikz@td@currentxx}{\pgf@xx/1cm}%
\pgfmathsetmacro{\tikz@td@currentxy}{\pgf@xy/1cm}%
\pgfmathsetmacro{\tikz@td@currentyx}{\pgf@yx/1cm}%
\pgfmathsetmacro{\tikz@td@currentyy}{\pgf@yy/1cm}%
\pgfmathsetmacro{\tikz@td@currentzx}{\pgf@zx/1cm}%
\pgfmathsetmacro{\tikz@td@currentzy}{\pgf@zy/1cm}%
\pgfmathsetmacro{\tikz@td@currentxz}{(\tikz@td@currentyx)*(\tikz@td@currentzy)-(\tikz@td@currentzx)*(\tikz@td@currentyy)}%
\pgfmathsetmacro{\tikz@td@currentyz}{(\tikz@td@currentzx)*(\tikz@td@currentxy)-(\tikz@td@currentxx)*(\tikz@td@currentzy)}%
\pgfmathsetmacro{\tikz@td@currentzz}{(\tikz@td@currentxx)*(\tikz@td@currentyy)-(\tikz@td@currentyx)*(\tikz@td@currentxy)}%
}
\tikzset{rotate about z axis/.code={%
\tikz@td@retrieve@current@basis
\pgfmathsetmacro{\newxx}{(\tikz@td@currentxx)*cos(#1)+(\tikz@td@currentxy)*sin(#1)}%
\pgfmathsetmacro{\newxy}{-1*(\tikz@td@currentxx)*sin(#1)+(\tikz@td@currentxy)*cos(#1)}%
\pgfmathsetmacro{\newyx}{(\tikz@td@currentyx)*cos(#1)+(\tikz@td@currentyy)*sin(#1)}%
\pgfmathsetmacro{\newyy}{-1*(\tikz@td@currentyx)*sin(#1)+(\tikz@td@currentyy)*cos(#1)}%
\tikzset{x={(\newxx cm,\newxy cm)},y={(\newyx cm,\newyy cm)},z={(\tikz@td@currentzx cm,\tikz@td@currentzy cm)}}%
},rotate about y axis/.code={%
\tikz@td@retrieve@current@basis
\pgfmathsetmacro{\newxx}{(\tikz@td@currentxx)*cos(#1)+(\tikz@td@currentxz)*sin(#1)}%
\pgfmathsetmacro{\newzx}{(\tikz@td@currentzx)*cos(#1)+(\tikz@td@currentzz)*sin(#1)}%
\tikzset{x={(\newxx cm,\tikz@td@currentxy cm)},
y={(\tikz@td@currentyx cm,\tikz@td@currentyy cm)},z={(\newzx cm,\newzy cm)}}%
},,rotate about x axis/.code={%
\tikz@td@retrieve@current@basis
\pgfmathsetmacro{\newyy}{(\tikz@td@currentyy)*cos(#1)+(\tikz@td@currentyz)*sin(#1)}%
\pgfmathsetmacro{\newzy}{(\tikz@td@currentzy)*cos(#1)+(\tikz@td@currentzz)*sin(#1)}%
\tikzset{x={(\tikz@td@currentxx cm,\tikz@td@currentxy cm)},
y={(\tikz@td@currentyx cm,\newyy cm)},z={(\tikz@td@currentzx cm,\newzy cm)}}%
}}
\makeatother
\begin{document} 
\tdplotsetmaincoords{60}{130}

\begin{tikzpicture}[scale=2,tdplot_main_coords,>=Stealth]

\path (0,0,0) coordinate (O) (2,0,0) coordinate (O');

\begin{scope}[canvas is xy plane at z=0]
%Circle in xy plane at z=0 
\path[fill=blue!40!white, draw=black] circle[radius=1cm];
\end{scope}

\begin{scope}[rotate about x axis=-20,canvas is xy plane at z=0,
shift={(O')}]
%Circle in transformed xy plane at z=0 
\path[fill=red!40!white, draw=black] circle[radius=1cm];
\end{scope}
\draw[thick,->] (0,0,0) -- (5,0,0) node[pos=1.05]{$x$}; 
\draw[thick,->] (0,0,0) -- (0,5,0) node[pos=1.05]{$y$}; 
\draw[thick,->] (0,0,0) -- (0,0,5) node[pos=1.05]{$z$};

\end{tikzpicture} 
\end{document}

在此处输入图片描述

1此语句指的是此库引入的正交变换。它不适用于透视图。

相关内容