考虑一个例子这幅画使用了 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@y
pgfcorepoints.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 的猫注意到了内部宏名称的变化,这使我的答案无效。所以我改正了它。