我正在尝试在 tikz 中绘制自己的 3d 形状。参数“xscale”和“yscale”按预期工作;但是,显然没有“zscale”。有什么快速解决方法吗?
谢谢。
编辑:为了获得更多背景信息,假设我想绘制一个长方体并能够在 z 轴上缩放它(x 和 y 轴都可以)。我的尝试如下。我应该如何更改它才能实现这一点?
\documentclass{article}
\usepackage{tikz}
\newcommand{\tikzcuboid}[7]{% width, height, depth, scale, scale x ->, scale y |, scale z/
\begin{tikzpicture}[scale = #4, xscale = #5, yscale = #6, zscale= #7]
\begin{scope}[thick, dashed]
%x strokes
\foreach \y in {0, ..., #2}
\foreach \z in {0, ..., #3}
\draw (0, \y, \z) -- (#1, \y, \z);
%y strokes
\foreach \x in {0, ..., #1}
\foreach \z in {0, ..., #3}
\draw (\x, 0, \z) -- (\x, #2, \z);
%z strokes
\foreach \x in {0, ..., #1}
\foreach \y in {0, ..., #2}
\draw (\x, \y, 0) -- (\x, \y, #3);
\end{scope}
\begin{scope}[very thick]
%x strokes
\foreach \y in {0, ..., #2}
\draw (0, \y, #3) -- (#1, \y, #3);
\foreach \z in {0, ..., #3}
\draw (0, #2, \z) -- (#1, #2, \z);
%y strokes
\foreach \x in {0, ..., #1}
\draw (\x, 0, #3) -- (\x, #2, #3);
\foreach \z in {0, ..., #3}
\draw (#1, 0, \z) -- (#1, #2, \z);
%z strokes
\foreach \x in {0, ..., #1}
\draw (\x, #2, 0) -- (\x, #2, #3);
\foreach \y in {0, ..., #2}
\draw (#1, \y, 0) -- (#1, \y, #3);
\end{scope}
\end{tikzpicture}
}
\begin{document}
\tikzcuboid{2}{2}{2}{1}{1}{1}{1}
\end{document}
答案1
z 方向的默认单位向量是 (-3.85mm, -3,85mm),因此也许您可以缩放它。即z={(#7*-3.85mm, #7*-3.85mm)}
。
\documentclass{article}
\usepackage{tikz}
\newcommand{\tikzcuboid}[7]{% width, height, depth, scale, scale x ->, scale y |, scale z/
\begin{tikzpicture}[scale = #4, xscale = #5, yscale = #6, z={(#7*-3.85mm, #7*-3.85mm)}]
\begin{scope}[thick, dashed]
%x strokes
\foreach \y in {0, ..., #2}
\foreach \z in {0, ..., #3}
\draw (0, \y, \z) -- (#1, \y, \z);
%y strokes
\foreach \x in {0, ..., #1}
\foreach \z in {0, ..., #3}
\draw (\x, 0, \z) -- (\x, #2, \z);
%z strokes
\foreach \x in {0, ..., #1}
\foreach \y in {0, ..., #2}
\draw (\x, \y, 0) -- (\x, \y, #3);
\end{scope}
\begin{scope}[very thick]
%x strokes
\foreach \y in {0, ..., #2}
\draw (0, \y, #3) -- (#1, \y, #3);
\foreach \z in {0, ..., #3}
\draw (0, #2, \z) -- (#1, #2, \z);
%y strokes
\foreach \x in {0, ..., #1}
\draw (\x, 0, #3) -- (\x, #2, #3);
\foreach \z in {0, ..., #3}
\draw (#1, 0, \z) -- (#1, #2, \z);
%z strokes
\foreach \x in {0, ..., #1}
\draw (\x, #2, 0) -- (\x, #2, #3);
\foreach \y in {0, ..., #2}
\draw (#1, \y, 0) -- (#1, \y, #3);
\end{scope}
\end{tikzpicture}
}
\begin{document}
\tikzcuboid{2}{2}{2}{1}{1}{1}{2}
\end{document}
答案2
3D 与 Asymptote 有不同的味道,我觉得更真实。一旦 三模块导入后,它为我们提供了 3 个线性独立的坐标:X=(1,0,0)
、Y=(0,1,0)
和Z=(0,0,1)
。我们可以选择视点为正交或透视投影。此外,缩放是直观的
xscale3(real x)
在 x 方向上按 x 缩放;
yscale3(real y)
在 y 方向上按 y 缩放;
zscale3(real z)
在 z 方向上按 z 缩放;
scale3(real s)
在 x、y 和 z 方向上按 s 缩放;
scale(real x, real y, real z)
在 x 方向上按 x 缩放,在 y 方向上按 y 缩放,在 z 方向上按 z 缩放;
在您的情况(我没有看到任何缩放!),将以下代码复制到http://asymptote.ualberta.ca/并点击运行查看结果(然后用鼠标自由旋转图形)
import three;
unitsize(3cm);
currentprojection=orthographic(2,1,1,zoom=.9,center=true);
draw(O--X--X+Y--Y--cycle^^Z--X+Z--X+Y+Z--Y+Z--cycle^^
O--Z^^X--X+Z^^X+Y--X+Y+Z^^Y--Y+Z);
path3 s1=.5X--.5X+Y--.5X+Y+Z--.5X+Z--cycle;
draw(s1^^.5X+.5Y--.5X+.5Y+Z,red);
path3 s2=.5Y--.5Y+X--.5Y+X+Z--.5Y+Z--cycle;
draw(s2^^.5Y+.5Z--X+.5Y+.5Z,green);
path3 s3=X+.5Z--X+.5Z+Y--.5Z+Y--.5Z--cycle;
draw(s3^^.5X+.5Z--.5X+.5Z+Y,blue);
//draw(surface(s1),red+opacity(.5));
//draw(surface(s2),green+opacity(.5));
//draw(surface(s3),blue+opacity(.5));
//draw(unitcube,yellow+opacity(.5));
如果您喜欢使用虚线来表达隐藏线,那么在投影固定时,手工绘制就很简单了。
import three;
size(8cm);
currentprojection=orthographic(2,1,1,zoom=.9,center=true);
draw(X--X+Y--Y^^Z--X+Z--X+Y+Z--Y+Z--cycle^^
X--X+Z^^X+Y--X+Y+Z^^Y--Y+Z);
draw(O--X^^O--Y^^O--Z,dashed);
draw(.5X+Z--.5X+Z+Y--.5X+Y,red);
draw(.5X+Z--.5X--.5X+Y^^.5X+.5Z--.5X+.5Z+Y,red+dashed);
draw(X+.5Z--X+.5Z+Y--.5Z+Y,orange);
draw(X+.5Z--.5Z--.5Z+Y^^.5Y+.5Z--X+.5Y+.5Z,orange+dashed);
draw(.5Y+Z--X+.5Y+Z--X+.5Y,blue);
draw(.5Y+Z--.5Y--X+.5Y^^.5X+.5Y--.5X+.5Y+Z,blue+dashed);
就我个人而言,我喜欢使用虚线而不是虚线opacity(.5)
来使物体透明,以便看到隐藏的线或曲线。
draw(surface(s1),red+opacity(.5));
draw(surface(s2),green+opacity(.5));
draw(surface(s3),blue+opacity(.5));
勾选pdf
下载,然后在 Acrobat 中打开,你会看到