\uput 如何确定对象框和假设圆的接触点?

\uput 如何确定对象框和假设圆的接触点?

这个问题为最符合该问题的答案提供了 4 个赏金,每个赏金 500。

\uput我对描述非零维对象的行为很感兴趣。非零维对象是具有 TeX 级别准备好的容器的对象。零维对象在 TeX 级别没有容器。

对于零维物体,其行为已知如下,现在我对此不再感兴趣。

在此处输入图片描述

让我们考虑以下两种情况:

情况1:

在此处输入图片描述

\documentclass[pstricks,border=12pt]{standalone} 
\SpecialCoor
\usepackage{multido} 

\def\NonZeroDimenObject{%
    \pspicture(2,1)
        \psframe(2,1)
        \psline[linecolor=blue]{->}(1,.5)(2,.5)
    \endpspicture}

\SpecialCoor

\begin{document} 

\multido{\i=0+15}{24}{%
\begin{pspicture}[showgrid](8,8)
    \pscircle(4,4){2}
    \psline[origin={4,4}](3.5;\i)
    \rput(4,4){\i}
    \uput{2}[\i]{0}(4,4){\NonZeroDimenObject}
\end{pspicture}}

\end{document}

案例 2:

在此处输入图片描述

\documentclass[pstricks,border=12pt]{standalone} 
\SpecialCoor
\usepackage{multido} 

\def\NonZeroDimenObject{%
    \pspicture(2,1)
        \psframe(2,1)
        \psline[linecolor=blue]{->}(1,.5)(2,.5)
    \endpspicture}

\SpecialCoor

\begin{document} 

\multido{\i=0+15}{24}{%
\begin{pspicture}[showgrid](8,8)
    \pscircle(4,4){2}
    \rput(4,4){\i}
    \uput{2}[0]{\i}(4,4){\NonZeroDimenObject}
\end{pspicture}}

\end{document}

问题:

我有 3 个问题:

  1. 对于给定的\alpha(或第二个参数),从 到(i_x,i_y)的一条线(i_x,i_y)+(r;\alpha)并不总是指向对象框和半径为 的假设圆之间的接触点labelsep。如何\uput确定接触点?解释内部算法应该没问题。

  2. 枢轴似乎不是静态的。如何\uput确定接触点?解释内部算法应该没问题。

  3. 我们什么时候才真正需要\uput?请给我至少 2 个无法被其他 put 宏替代的实用独特示例。

答案1

\documentclass[pstricks,border=12pt]{standalone} 
\SpecialCoor
\usepackage{multido} 

\def\Width{3 }
\def\Height{1 }
\def\NonZeroDimenObject#1{%
    \pspicture(\Width,\Height)\psframe(\Width,\Height)\endpspicture}    
\SpecialCoor
\psset{dotscale=0.5}
\begin{document} 

\multido{\i=0+5}{73}{%
\begin{pspicture}[showgrid](9,8)
    \multido{\iB=0+1}{\i}{\uput{2}[\iB]{0}(4,4){\pspicture(\Width,\Height)\psdot(!\Width 2 div \Height 2 div)\endpspicture}}
    \pscircle(4,4){2}
    \rput(4,4){\psline[linecolor=blue]{->}(3;\i)}
    \rput(4,4){\i}
    \uput{2}[\i]{0}(4,4){\NonZeroDimenObject{\i}}
\end{pspicture}}

\end{document}

第一个是labelsep=0。如果它不是正方形,它将使用变换矩阵进行平移。

在此处输入图片描述 在此处输入图片描述 在此处输入图片描述

答案2

在我看来,解释是显而易见的:

  1. \uput{2}[\i]{0}(4,4){\NonZeroDimenObject}

    考虑 object 之前的 4 个参数\NonZeroDimenObject。它被放置在

    • 在径向距离2单位处(runits具体来说) - 第一个参数{.}
    • 以 的可变角度\i(范围从 到0345步长为度增量,总共15~步;根据 的定义) - 第二个参数;24\multido{<type/var>=<start>+<diff>}{<repititions>}{<stuff>}[.]
    • 0围绕对象中心原点进行固定角度的旋转——第三个参数{.}
    • 从点 (x,y) = ( 4,4) - 第四个参数(.,.)
  2. \uput{2}[0]{\i}(4,4){\NonZeroDimenObject}

    考虑 object 之前的 4 个参数\NonZeroDimenObject。它被放置在

    • 在径向距离2单位处(runits具体来说) - 第一个参数{.}
    • 以固定的角度0-第二个参数[.]
    • \i围绕物体中心原点以度为单位进行可变旋转(范围从0到,3605度为单位递增,总共约 73 步;根据 的定义\multido{<type/var>=<start>+<diff>}{<repititions>}{<stuff>})- 第三个参数{.};和
    • 从点 (x,y) = ( 4,4) - 第四个参数(.,.)
  3. \uput{<labelsep>}[<refangle>]{<rotation>}(<x,y>){<stuff>}是一个便利宏,\rput它还执行大量繁重的工作,将对象放置在所需的参考点上。在某些(非常)特殊的情况下,您可以使用\rput命令组合来获得与 类似的放置\uput,如下例所示(例如 45 度角):

    在此处输入图片描述

    \documentclass{article}
    \usepackage{pstricks}% http://tug.org/PSTricks/main.cgi/
    \begin{document} 
    \SpecialCoor
    
    \noindent
    \begin{minipage}{0.5\linewidth}
    \begin{pspicture}[showgrid](3,3)
      \pscircle*(1.5,1.5){1}
      \uput{1.2}[45]{0}(1.5,1.5){$v$}
    \end{pspicture}
    \end{minipage}%
    \begin{minipage}{0.5\linewidth}
    \begin{pspicture}[showgrid](3,3)
      \pscircle*(1.5,1.5){1}
      \rput{0}(1.5,1.5){\rput[bl]{0}(1.2;45){$v$}}
    \end{pspicture}
    \end{minipage}
    \end{document}
    

    正如预期的那样,输出是相同的。

    方便之处在哪里?嗯,\uput自动决定放置对象时使用的参考点,以保证它<labelsep>与放置点有径向距离。以下示例显示了这一点:

    在此处输入图片描述 在此处输入图片描述 在此处输入图片描述

    \documentclass[pstricks,border=12pt]{standalone}% http://ctan.org/pkg/standalone
    \usepackage{multido}% http://ctan.org/pkg/multido
    \begin{document} 
    
    \SpecialCoor
    \multido{\i=0+15}{24}{%
      \begin{pspicture}[showgrid](3,3)
        \psline[linecolor=gray,origin={1.5,1.5}](1.2;\i)
        \pscircle(1.5,1.5){1}
        \rput(1.5,1.5){\i}
        \uput{1.2}[\i]{0}(1.5,1.5){$v$}% Example 1
        %\rput{0}(1.5,1.5){\rput{0}(1.2;\i){$v$}}% Example 2
        %\rput{0}(1.5,1.5){\rput[bl]{0}(1.2;\i){$v$}}% Example 3
      \end{pspicture}
    }
    
    \end{document}
    

    通过注释掉/添加示例 1、2 或 3 所需的行,可以从上述代码中获得三个动画的相应输出。

    注意,\uput始终保持固定的径向距离,而\rput使用固定参考点时,则会受到影响。如果没有固定参考点,则默认为对象的中心。


以下显示了为了充分回答该问题必须计算的距离和平移的差异:

在此处输入图片描述

\documentclass[pstricks,border=12pt]{standalone}% http://ctan.org/pkg/standalone
\usepackage{multido,pst-node}% http://ctan.org/pkg/{multido,pst-node)
\def\Width{3 }
\def\Height{1 }
\def\NonZeroDimenObject{%
    \pspicture(\Width,\Height)\psframe(\Width,\Height)\endpspicture}
\SpecialCoor
\psset{dotscale=0.5}
\begin{document} 

\multido{\i=0+5}{73}{%
\begin{pspicture}[showgrid](9,8)
  \pscircle(4,4){2}
  \uput{2}[\i]{0}(4,4){\rnode{MyNode}{\NonZeroDimenObject}\pnode(! \psGetNodeCenter{MyNode} MyNode.x MyNode.y){NZDOcentre}}
  \rput{0}(4,4){\psline[linecolor=blue]{->}(2;\i)}
  \psline[linecolor=red]{->}(4,4)(NZDOcentre)
  \rput(4,4){\i}
\end{pspicture}}

蓝线表示命令指向的精确角度和距离\uput,而红线表示中心\NonZeroDimenObject

相关内容