![动画展示绕旋转对称轴旋转的四面体](https://linux22.com/image/414165/%E5%8A%A8%E7%94%BB%E5%B1%95%E7%A4%BA%E7%BB%95%E6%97%8B%E8%BD%AC%E5%AF%B9%E7%A7%B0%E8%BD%B4%E6%97%8B%E8%BD%AC%E7%9A%84%E5%9B%9B%E9%9D%A2%E4%BD%93.png)
\documentclass[pstricks, border=12pt]{standalone}
\usepackage{pst-solides3d}
\usepackage{xfp}
\psset
{
lightsrc=viewpoint,
Decran=30,
solidmemory,
}
\newcommand{\al}{3}
\newcommand{\ax}{4}
\edef\ax{\fpeval{\al+0.1}}
\newcommand{\ul}{0}
\newcommand{\um}{0.81731}
\newcommand{\un}{0.57620}
\begin{document}
\multido{\i=0+{5}}{73}
{
\begin{pspicture}[viewpoint=30 20 30 rtp2xyz] (-4.5,-3) (4.5,5)
\defFunction[algebraic]{ntr}(x,y,z)
{x*(\ul*\ul*(1-cos({\i})) + cos({\i})) + y*(\um*\ul*(1-cos({\i})) - \un*sin({\i})) + z*(\un*\ul*(1-cos({\i})) + \um*sin({\i}))}
{x*(\ul*\um*(1-cos({\i})) + \un*sin({\i})) + y*(\um*\um*(1-cos({\i})) + cos({\i})) + z*(\un*\um*(1-cos({\i})) - \ul*sin({\i}))}
{x*(\ul*\un*(1-cos({\i})) - \um*sin({\i})) + y*(\um*\un*(1-cos({\i})) + \ul*sin({\i})) + z*(\un*\un*(1-cos({\i})) + cos({\i}))}
\psSolid[
object=tetrahedron,
action=draw*,
r=2.12132,
fillcolor=magenta!20,
transform=ntr,
] %(0,0,0.71)
\psSolid[
object=line,
args=-1 0 \fpeval{0-0.71} 1 0 \fpeval{1.41-0.71},
]
\axesIIID[labelsep=10pt] (\al,\al,\al) (\ax,\ax,\ax)
\end{pspicture}
}
\end{document}
我想绕给定的线旋转给定的四面体。仅使用pst-solides3d
似乎是不可能的 - 至少我在文档中没有找到任何类似的操作。我想这将需要 Ti钾Z。
我的最终目标是制作旋转四面体的动画,因此multido
代码中有一个块。
编辑。我认为可以用 来完成pst-solides3d
。事实上,它有一个非常通用的转换选项。该选项接受代数表达式。为了使用它,我首先平移当前对象,使线穿过原点。然后我将使用旋转矩阵。\ul,\um,\un
是与直线平行的单位向量的坐标。此解决方案中唯一剩下的就是正确编写代数表达式。我第一次尝试是在编辑后的代码中,但它失败了,并显示以下消息:
DEBUG: FC_WEIGHT didn't match
Error: /undefined in
Operand stack:
--nostringval-- les_sommets --nostringval-- --nostringval-- 0.0 0.0 1.0
Execution stack:
%interp_exit .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- false 1 %stopped_push 1990 1 3 %oparray_pop 1989 1 3 %oparray_pop 1977 1 3 %oparray_pop 1833 1 3 %oparray_pop --nostringval-- %errorexec_pop .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- --nostringval-- 3 --nostringval-- %repeat_continue --nostringval-- --nostringval-- --nostringval-- --nostringval-- --nostringval--
Dictionary stack:
--dict:739/1123(ro)(G)-- --dict:0/20(G)-- --dict:120/200(L)-- --dict:750/1012(L)-- --dict:179/300(L)-- --dict:38/200(L)-- --dict:218/300(L)-- --dict:750/1012(L)-- --dict:2/3(L)-- --dict:3/3(L)-- --dict:3/3(L)-- --dict:3/3(L)-- --dict:14/22(L)--
Current allocation mode is local
Last OS error: No such file or directory
Current file position is 429054
GPL Ghostscript 9.52: Unrecoverable error, exit code 1
答案1
我能够消除 postscript 错误。这是通过删除\i
s 周围的括号和一些不可见的制表符(可能是我的编辑器引入了它们,但我不得不删除它们)来实现的。连同您自己的评论中的附加信息(1和2)得出
\documentclass[pstricks, border=12pt]{standalone}
\usepackage{pst-solides3d}
\usepackage{xfp}
\psset
{
lightsrc=viewpoint,
Decran=30,
solidmemory,
}
\newcommand{\al}{3}
\newcommand{\ax}{4}
\edef\ax{\fpeval{\al+0.1}}
\newcommand{\ul}{0}
\newcommand{\um}{0.81731}
\newcommand{\un}{0.57620}
\begin{document}
\multido{\i=0+{5}}{71}
{
\begin{pspicture}[viewpoint=30 20 30 rtp2xyz] (-4.5,-3) (4.5,5)
\defFunction[algebraic]{ntr}(x,y,z)
{x*(\um*\um*(1-cos(\i*3.14159/180))+cos(\i*3.14159/180))+y*(\ul*\um*(1-cos(\i*3.14159/180))-\un*sin(\i*3.14159/180))+z*(\un*\um*(1-cos(\i*3.14159/180))+\ul*sin(\i*3.14159/180))}%
{x*(\um*\ul*(1-cos(\i*3.14159/180))+\un*sin(\i*3.14159/180))+y*(\ul*\ul*(1-cos(\i*3.14159/180))+cos(\i*3.14159/180))+z*(\un*\ul*(1-cos(\i*3.14159/180))-\um*sin(\i*3.14159/180))}%
{x*(\um*\un*(1-cos(\i*3.14159/180))-\ul*sin(\i*3.14159/180))+y*(\ul*\un*(1-cos(\i*3.14159/180))+\um*sin(\i*3.14159/180))+z*(\un*\un*(1-cos(\i*3.14159/180))+cos(\i*3.14159/180))}%
\psSolid[
object=tetrahedron,
action=draw*,
r=2.12132,
fillcolor=magenta!20,
transform=ntr,
] %(0,0,0.71)
\psSolid[
object=line,
args=-1 0 \fpeval{0-0.71} 1 0 \fpeval{1.41-0.71},
]
\axesIIID[labelsep=10pt] (\al,\al,\al) (\ax,\ax,\ax)
\end{pspicture}
}
\end{document}