\pstTranslation
在以下 MWE 中,只有通过计算的和角度的组合N-P.y N-P.x atan 90 sub
会产生误差。
如何解决?
平均能量损失
\documentclass[pstricks,margin=1cm]{standalone}
\usepackage{pst-eucl}
\psset{saveNodeCoors,PointName=none,PointSymbol=none}
\def\Pic#1#2#3{%
\begin{pspicture}[showgrid](4,5)
% node type switch
\ifnum#1=0\relax
\pnode(0,0){O}
\pnode(2,1){A}
\pnode(1,4){B}
\else
\pstGeonode
(0,0){O}
(2,1){A}
(1,4){B}
\fi
% transformation switch
\ifnum#2=0\relax
\nodexn{(B)-(A)}{P}
\else
\pstTranslation{A}{B}{O}[P]
\fi
%
\pcline(A)(B)
\pscircle(A){1}
% angle calculation switch
\ifnum#3=0\relax
\uput{1}[(P)]{!\psGetNodeCenter{P}P.y P.x atan 90 sub}(>A){\psline[linecolor=red]{->}(0,1)}
\else
\uput{1}[(P)]{!N-P.y N-P.x atan 90 sub}(>A){\psline[linecolor=red]{->}(0,1)}
\fi
\end{pspicture}}
\begin{document}
\Pic{1}{0}{1}
\Pic{1}{0}{0}
%\Pic{1}{1}{1}
\Pic{1}{1}{0}
\Pic{0}{0}{1}
\Pic{0}{0}{0}
%\Pic{0}{1}{1}
\Pic{0}{1}{0}
\end{document}
答案1
{!\psGetNodeCenter{P}P.y P.x atan 90 sub ...
只能与默认的 PSTricks 节点一起使用,而不能与 定义的节点一起使用\pstGeonode
。使用类似
[...]
\pnode(P){P1}
\uput{1}[(P)]{!\psGetNodeCenter{P1} P1.y P1.x atan 90 sub}(>A){%
\psline[linecolor=red]{->}(0,1)}
[...]
答案2
基于Christoph 的解释,我可以总结如下:
如果是由转换宏( 或其他)内部的节点创建宏(或)
B
创建的节点,则提供的点将\pnode
\pstGeonode
\rput
\uput
(!N-B.y N-B.x)
saveNodeCoors=true
不是(!\psGetNodeCenter{B} B.y B.x)
与或相同(B)
。B
通过\pnode(B){C}
或进行缓冲\pstGeonode(B){C}
是一种使它们表现相同的方法。
在以下示例中,
- 红点代表用 创建的点
(!N-B.x N-B.y)
。 - 绿点代表用 创建的点
(!N-C.x N-C.y)
。 - 蓝点表示用
(B)
或创建的点(!\psGetNodeCenter{B} B.y B.x)
。由于 的(B)
行为与 相同 ,因此仅给出了(!\psGetNodeCenter{B} B.y B.x)
的用法。(B)
绿点(!N-C.x N-C.y)
和蓝(B)
点位于同一位置,但红(!N-B.x N-B.y)
点则不然。
案例 1:使用文字创建节点(x,y)
\documentclass[pstricks,border=1cm]{standalone}
\usepackage{pst-node}
\begin{document}
\begin{pspicture}[saveNodeCoors,showgrid](4,6)
\rput(1,2){\pnode(3,4){B}}
\pnode(B){C}
\pscircle*[linecolor=red](!N-B.x N-B.y){4pt}
\pscircle*[linecolor=green](!N-C.x N-C.y){3pt}
\pscircle*[linecolor=blue](B){2pt}
\end{pspicture}
\end{document}
评论:
\rput(1,2){\pnode(3,4){B}}
\pnode(B){C}
产生以下结果。
(B)=(1+3,2+4)
<--- 翻译效果N-B.y=4
并且N-B.x=3
<--- 没有翻译效果(C)=(B)=(1+3,2+4)
案例 2:使用另一个节点创建节点
\documentclass[pstricks,border=1cm]{standalone}
\usepackage{pst-node}
\begin{document}
\begin{pspicture}[saveNodeCoors,showgrid](4,6)
\pnode(3,4){A}
\rput(1,2){\pnode(A){B}}
\pnode(B){C}
\pscircle*[linecolor=red](!N-B.x N-B.y){4pt}
\pscircle*[linecolor=green](!N-C.x N-C.y){3pt}
\pscircle*[linecolor=blue](B){2pt}
\end{pspicture}
\end{document}
评论:
\pnode(3,4){A}
\rput(1,2){\pnode(A){B}}
\pnode(B){C}
产生以下结果。
(B)=(A)=(3,4)
<--- 翻译无效果N-B.y=4-2
并且N-B.x=3-1
<--- 翻译的效果是一样的,但是却是相反的。很奇怪吗?(C)=(B)=(3,4)
推荐
N-B.y
由于and的行为与orN-B.x
不同,最好避免使用and 。它们容易让人混淆!B
(!\psGetNodeCenter{B} B.y B.x)
N-B.y
N-B.x