使用 Pstricks 极坐标时覆盖 (0,0) 默认值

使用 Pstricks 极坐标时覆盖 (0,0) 默认值

考虑一下代码

\documentclass[12pt]{book} 
\usepackage{pstricks,xcolor,graphicx}

\begin{document}
\thispagestyle{empty}

\begin{pspicture}(-5,-5)(5,12)%
\psframe[fillcolor=yellow!35!brown,fillstyle=solid](-5,-5)(5,12) 
\psframe[linecolor=yellow!35!brown](-5,-5)(5,12)

\SpecialCoor % Provides for polar coordinates (r;t) ; r = length (cm); t = angle (degrees)
\psgrid
\rput(4;0){\includegraphics[width=1.4em]{example-image-a}}
\rput(4;15){\includegraphics[width=1.4em]{example-image-a}}
\rput(4;30){\includegraphics[width=1.4em]{example-image-a}}
\rput(4;45){\includegraphics[width=1.4em]{example-image-a}}
\rput(4;60){\includegraphics[width=1.4em]{example-image-a}}
\rput(4;75){\includegraphics[width=1.4em]{example-image-a}}
\rput(4;90){\includegraphics[width=1.4em]{example-image-a}}
\rput(4;105){\includegraphics[width=1.4em]{example-image-a}}
\end{pspicture}%
\end{document}

产生输出

在此处输入图片描述

\rput命令始终相对于笛卡尔(即 (x,y))点 (0,0)。如果可能的话,我想改变这一点。

目前,\rput(4;0)将在距离 (0,0) 0 度和 4 个单位的位置绘制相关图像。

\rput(4;15)将在距 (0,0) 15 度和 4 个单位的位置绘制相关图像。

ETC。

问题:我如何覆盖 (0,0) 默认值来绘制图像,例如相对于笛卡尔点 (0,6)?代码是用 编译的xelatex,我正在寻找一个可以修改 MWE 并可以用 编译的答案xelatex

评论:确实,效果只是简单地将图像的散射(在本例中)向上平移了 6 个单位。但是,在我需要这个的文档中,有相当多的图像,将参考点从 (0,0) 更改为其他点是最方便的,以免平移后的图像干扰其他现有图像。因此,这篇文章的目的是将 (0,0) 默认值替换为 (0,6) 作为参考点。

谢谢。

答案1

您可以使用一个节点,然后指定相对于该节点的极坐标:

\documentclass[12pt]{book} 
\usepackage{pstricks,pst-node,xcolor,graphicx}

\begin{document}
\thispagestyle{empty}

\begin{pspicture}(-5,-5)(5,12)%
\psframe[fillcolor=yellow!35!brown,fillstyle=solid](-5,-5)(5,12) 
\psframe[linecolor=yellow!35!brown](-5,-5)(5,12)

\SpecialCoor % Provides for polar coordinates (r;t) ; r = length (cm); t = angle (degrees)
\psgrid
\pnode(0,6){center}
\rput([nodesep=4,angle=0]center){\includegraphics[width=1.4em]{example-image-a}}
\rput([nodesep=4,angle=15]center){\includegraphics[width=1.4em]{example-image-a}}
\rput([nodesep=4,angle=30]center){\includegraphics[width=1.4em]{example-image-a}}
\rput([nodesep=4,angle=45]center){\includegraphics[width=1.4em]{example-image-a}}
\rput([nodesep=4,angle=60]center){\includegraphics[width=1.4em]{example-image-a}}
\rput([nodesep=4,angle=75]center){\includegraphics[width=1.4em]{example-image-a}}
\rput([nodesep=4,angle=90]center){\includegraphics[width=1.4em]{example-image-a}}
\rput([nodesep=4,angle=105]center){\includegraphics[width=1.4em]{example-image-a}}
\end{pspicture}%
\end{document}

如果您不想更改语法,您还可以修补\polar@coor用于应用极坐标的内部宏,以便随后移动结果点:

\documentclass[12pt]{book} 
\usepackage{pstricks,xcolor,graphicx}

\makeatletter
\let \original@polar@coor \polar@coor
\newcommand \polar@transform@code{}
\renewcommand \polar@coor[2] {%
 \original@polar@coor {#1}{#2}%
 \edef\pst@coor{%
   \pst@coor
   \polar@transform@code
 }%
}
\def \MovePolarBase(#1){%
  \pst@@getcoor{#1}%
  \edef \polar@transform@code {%
    stack exch \pst@coor 3 1 roll add 3 1 roll add stack
  }%
  \show\polar@transform@code
}
\makeatother

\begin{document}
\thispagestyle{empty}

\begin{pspicture}(-5,-5)(5,12)%
\psframe[fillcolor=yellow!35!brown,fillstyle=solid](-5,-5)(5,12) 
\psframe[linecolor=yellow!35!brown](-5,-5)(5,12)

\SpecialCoor % Provides for polar coordinates (r;t) ; r = length (cm); t = angle (degrees)
\psgrid
\MovePolarBase(0,6)
\rput(4;0){\includegraphics[width=1.4em]{example-image-a}}
\rput(4;15){\includegraphics[width=1.4em]{example-image-a}}
\rput(4;30){\includegraphics[width=1.4em]{example-image-a}}
\rput(4;45){\includegraphics[width=1.4em]{example-image-a}}
\rput(4;60){\includegraphics[width=1.4em]{example-image-a}}
\rput(4;75){\includegraphics[width=1.4em]{example-image-a}}
\rput(4;90){\includegraphics[width=1.4em]{example-image-a}}
\rput(4;105){\includegraphics[width=1.4em]{example-image-a}}
\end{pspicture}%
\end{document}

两者都导致相同的结果: 在此处输入图片描述

答案2

以下重新定义了\rput@iv,它是用于处理坐标规范的内部宏之一。它将极坐标转换为笛卡尔坐标(分别对 x 和 y 使用 radius*cos(angle) 和 radius*sin(angle)),添加指定的笛卡尔坐标,然后\rput@v使用新的笛卡尔坐标调用下一个宏。计算是使用 执行的xfp,它具有内置函数cosdsind用于度数的余弦和正弦。

当然,如果您仍然想将原始定义用于其他图或其他点,那么您可以先存储定义(使用\let)并在需要时恢复它。

梅威瑟:

\documentclass[12pt]{book}
\usepackage{pstricks,xcolor,graphicx}
\usepackage{xfp}

\begin{document}
\thispagestyle{empty}
\def\xtranslation{0}
\def\ytranslation{6}
\makeatletter
\def\rput@iv(#1;#2){%
\edef\xtranslated{\fpeval{#1*cosd(#2)+\xtranslation}}%
\edef\ytranslated{\fpeval{#1*sind(#2)+\ytranslation}}%
\message{print #1;#2 at \xtranslated,\ytranslated}
\pst@killglue \pst@makebox {\rput@v {\xtranslated,\ytranslated}}%
}
\makeatother
\begin{pspicture}(-5,-5)(5,12)%
\psframe[fillcolor=yellow!35!brown,fillstyle=solid](-5,-5)(5,12) 
\psframe[linecolor=yellow!35!brown](-5,-5)(5,12)

\SpecialCoor % Provides for polar coordinates (r;t) ; r = length (cm); t = angle (degrees)
\psgrid
\rput(4;0){\includegraphics[width=1.4em]{example-image-a}}
\rput(4;15){\includegraphics[width=1.4em]{example-image-a}}
\rput(4;30){\includegraphics[width=1.4em]{example-image-a}}
\rput(4;45){\includegraphics[width=1.4em]{example-image-a}}
\rput(4;60){\includegraphics[width=1.4em]{example-image-a}}
\rput(4;75){\includegraphics[width=1.4em]{example-image-a}}
\rput(4;90){\includegraphics[width=1.4em]{example-image-a}}
\rput(4;105){\includegraphics[width=1.4em]{example-image-a}}
\end{pspicture}%
\end{document}

结果:

在此处输入图片描述

答案3

PSTricks 解决方案仅用于娱乐或比较目的。

\documentclass[pstricks,border=\dimexpr355mm/113]{standalone}
\usepackage{pst-plot}
\usepackage{graphicx}
\begin{document}


\def\N{16 } % the trailing space is needed!
\def\a{4}
\def\b{3}
\def\x{6}
\def\y{0}

\begin{pspicture}[showgrid](-1,-4)(11,4)
    \degrees[\N]
    \curvepnodes[plotpoints=\numexpr\N+1]{0}{\N AnytoRad}{\a*cos(t)+\x|\b*sin(t)+\y}{A}
    \psellipse(\x,\y)(\a,\b)
    \foreach \i in {0,...,\numexpr\N-1}{\rput(A\i){\includegraphics[width=1cm]{example-image-a}}}
\end{pspicture}
\end{document}

在此处输入图片描述

相关内容