动画展示绕旋转对称轴旋转的四面体

动画展示绕旋转对称轴旋转的四面体
\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似乎是不可能的 - 至少我在文档中没有找到任何类似的操作。我想这将需要 TiZ。

我的最终目标是制作旋转四面体的动画,因此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 错误。这是通过删除\is 周围的括号和一些不可见的制表符(可能是我的编辑器引入了它们,但我不得不删除它们)来实现的。连同您自己的评论中的附加信息(12)得出

\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}

在此处输入图片描述

相关内容