zscale 无法识别

zscale 无法识别

我正在尝试在 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 中打开,你会看到

在此处输入图片描述

相关内容