假设我正在绘制一幅 3D 图片。现在我想在 yz 平面上绘制一个透视正确的圆,但 TikZ 似乎无法做到这一点。人们只能在 xy 平面上绘制圆。此外,采用两个半径的椭圆也只在 xy 平面上绘制。我知道我可以用来rotate
旋转椭圆,但这并不简单,因为它涉及计算旋转角度和半径。
那么,有什么办法可以告诉TikZ
您在某个平面上进行绘制吗?或者还有其他花哨的包吗?
仅供说明:
\documentclass[parskip]{scrartcl}
\usepackage[margin=15mm]{geometry}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\draw (0,0,0) -- (0,4,0) -- (0,4,4) -- (0,0,4) -- cycle;
\draw (0,2,2) circle (2);
\end{tikzpicture}
\end{document}
产生
显然,我想在 yz 平面上画一个圆。这看起来像一个椭圆,完美地适合 yz 平面正方形(由于透视,它看起来像一个平行四边形)。
答案1
这是使用 3d 库可以绘制的两个示例。第一个示例已被修改,因为阴影颜色有问题。
\documentclass[]{article}
\usepackage{tikz}
\usetikzlibrary{3d}
\usepackage[active,tightpage]{preview}
\PreviewEnvironment{tikzpicture}
\setlength\PreviewBorder{5pt}%
\begin{document}
\begin{tikzpicture}
[x={(-0.2cm,-0.4cm)}, y={(1cm,0cm)}, z={(0cm,1cm)},
scale=3,
fill opacity=0.80,
color={gray},bottom color=white,top color=black]
\tikzset{zxplane/.style={canvas is zx plane at y=#1,very thin}}
\tikzset{yxplane/.style={canvas is yx plane at z=#1,very thin}}
\begin{scope}[yxplane=-1]
\shade[draw] (-1,-1) rectangle (1,1);
\draw (0,0) circle[radius=1cm] ;
\end{scope}
\begin{scope}[zxplane=-1]
\shade[draw] (-1,-1) rectangle (1,1);
\end{scope}
\begin{scope}[zxplane=1]
\shade[draw] (-1,-1) rectangle (1,1);
\end{scope}
\begin{scope}[yxplane=1]
\shade[draw] (-1,-1) rectangle (1,1);
\end{scope}
\end{tikzpicture}
\begin{tikzpicture}[scale=4]
\begin{scope}[canvas is zy plane at x=0]
\draw (0,0) circle (1cm);
\draw (-1,0) -- (1,0) (0,-1) -- (0,1);
\end{scope}
\begin{scope}[canvas is zx plane at y=0]
\draw (0,0) circle (1cm);
\draw (-1,0) -- (1,0) (0,-1) -- (0,1);
\end{scope}
\begin{scope}[canvas is xy plane at z=0]
\draw (0,0) circle (1cm);
\draw (-1,0) -- (1,0) (0,-1) -- (0,1);
\end{scope}
\end{tikzpicture}
\end{document}
答案2
pst-3dplot
是pstricks
套件并提供宏来在 3D 平面上打印常规 2D 东西(以及其它东西)。
这是一个最小的例子,在三个正交平面上绘制一个圆:xy
和:xz
yz
\documentclass{article}
\usepackage{graphicx}% http://ctan.org/pkg/graphicx
\usepackage{pst-3dplot}% http://ctan.org/pkg/pst-3dplot
\usepackage{xcolor}% http://ctan.org/pkg/xcolor
\begin{document}
\begin{pspicture}(5,5)
\psset{linewidth=0.5pt,linecolor=black!50,unit=2cm}%
\pstThreeDLine(-2,0,0)(2,0,0)% x-axis
\pstThreeDLine(0,-2,0)(0,2,0)% y-axis
\pstThreeDLine(0,0,-2)(0,0,2)% z-axis
\psset{linewidth=1pt,linecolor=black}
\pstPlanePut[plane=xy](0,0,0){%
\pscircle[linestyle=solid](0,0){2cm}%
\rput{90}(-2.5cm,2.5cm){XY-plane}%
}
\pstPlanePut[plane=xz](0,0,0){%
\pscircle[linestyle=dashed](0,0){2cm}%
\rput{0}(-2.5cm,2.5cm){\reflectbox{XZ-plane}}%
}
\pstPlanePut[plane=yz](0,0,0){%
\pscircle[linestyle=dotted](0,0){2cm}%
\rput{0}(-2.5cm,2.5cm){YZ-plane}%
}
\end{pspicture}
\end{document}
包括的唯一理由graphicx
是为了\reflectbox
。
Alpha
可以使用不同的或值Beta
(球面坐标的两个分量)或使用旋转角度\RotX
和\RotY
来修改对象的透视\RotZ
。请参阅包装文档更多示例。