如何全局设置用户定义的坐标系?

如何全局设置用户定义的坐标系?

考虑一个例子这幅画使用了 3D 透视包中tikz3d定义了一个新的坐标系3d,坐标指定为(3d cs:1,2,3)etc。

是否可以为当前范围全局设置坐标系,以避免3d cs:每个坐标中的前缀?有类似的东西吗every coordinate/.cs={3d}

答案1

坐标规范(1,2,3)最终将由

\pgfpointxyz{1}{2}{3}

您可以重新定义此宏(本地)来实现不同的坐标系。

具体来说,是一个读取三个数字并定义为所需的 x 坐标和所需的 y 坐标的\pgfpointxyz宏。(请参阅第 852-864 行了解其原始定义。)\pgf@x\pgf@ypgfcorepoints.code.tex


在这种情况下,如果坐标系已经准备好,你也可以这样做

\def\tikz@parse@splitxyz#1#2#3,#4,{%
    \def\pgfutil@next{\tikz@scan@one@point#1(3d cs:{#2},{#3},{#4})}%
}

请参阅tikz.code.tex第 5415 至 5417 行了解其原始定义。


顺便说一句,已经有一个名为 3d 的库,您可能想使用除 之外的其他名称3d


这是一个工作示例。两者的代码tikzpicture相同。但是使用不同的解析器,它们会得出不同的曲线。

\documentclass[border=9,tikz]{standalone}
\usetikzlibrary{3d}
\begin{document}

\makeatletter
\def\tikz@parse@splitxyz#1#2#3,#4,{%
    \def\pgfutil@next{\tikz@scan@one@point#1(xyz cylindrical cs:angle=#2,radius=#3,z=#4)}%
}
\tikz{
    \draw(0,2,0)foreach\i in{1,...,200}{
        --(17*\i,2,\i/80)
    };
}
\def\tikz@parse@splitxyz#1#2#3,#4,{%
    \def\pgfutil@next{\tikz@scan@one@point#1(xyz spherical cs:angle=#2,radius=#3,latitude=#4 r)}%
}
\tikz{
    \draw(0,2,0)foreach\i in{1,...,200}{
        --(17*\i,2,\i/80)
    };
}

编辑日志:@Schrödinger 的猫注意到了内部宏名称的变化,这使我的答案无效。所以我改正了它。

相关内容