我发现这来自用户 Caramdir 的回答,实际上我正在尝试让代码符合我的需求。有类似这样的
\newcommand\definePointByXYZ[4]{
%\coordinate (#1) at (#2,#3,#4);
\expandafter\gdef\csname tsx@point@#1\endcsname{
\def\tsx@point@x{#2}
\def\tsx@point@y{#3}
\def\tsx@point@z{#4}
}
}
% Define a plane.
% #1 = name of the plane
% #2*x + #3*y + #4*z = #5 is the equation of the plane
\newcommand*\definePlaneByEquation[5]{
\expandafter\gdef\csname tsx@plane@#1\endcsname{
\def\tsx@plane@xcoeff{#2}
\def\tsx@plane@ycoeff{#3}
\def\tsx@plane@zcoeff{#4}
\def\tsx@plane@scalar{#5}
}
}
% Project a point to a plane.
% #1 = name of the new point
% #2 = name of old point
% #3 = name of plane
\newcommand\projectPointToPlane[3]{{
\csname tsx@point@#2\endcsname
\csname tsx@plane@#3\endcsname
% ...
}}
在命令中,projectPointToPlane
参数是两个由 \definePointByXYZ 定义的点,然后可以计算任何东西,例如:
\pgfmathparse{\tsx@plane@xcoeff*\tsx@plane@xcoeff + \tsx@plane@ycoeff*\tsx@plane@ycoeff + \tsx@plane@zcoeff*\tsx@plane@zcoeff}
\let\nnormsq\pgfmathresult
现在我想创造这样的东西
% #1 = Name of the object
% #2 = Point A
% #2 = Point B
\newcommand*\mynewcommand[3]{
\csname tsx@point@#2\endcsname
\csname tsx@point@#3\endcsname
% Calculate something
\pgfmathsetmacro{\myvariable}{%any expression}
}
我的问题:如何用两个点的坐标进行计算?有可能吗?我的第一次尝试是将一条线重命名为,\csname tsx@pointtwo@#3\endcsname
然后
\pgfmathsetmacro{\myvariable}{\tsx@point@x *\tsxpointtwo@x}
但那没用。我是 TeX 编程的新手,所以任何帮助我都非常感谢。:)
答案1
你的问题是\csname tsx@point@#1 \endcsname
定义了所有\tsx@point@x
,y
并且z
,一旦你调用\csname tsx@point@#2 \endcsname
它定义它们再次覆盖先前的值,因此只剩下最后发出的坐标tsx@point@#1
。
解决此问题的一种方法是在调用另一个之前对和\let\first@point@x\tsx@point@x
进行依此类推,然后您可以通过持有人访问第一个声明的点。y
z
\csname tsx@point@#2\endcsname
\first@point@<x,y,z>
平均能量损失
% #1 = Name of the object
% #2 = Point A
% #2 = Point B
\newcommand*\mynewcommand[3]{
\csname tsx@point@#2\endcsname
\let\first@point@x\tsx@point@x
\let\first@point@y\tsx@point@y
\let\first@point@z\tsx@point@z
\csname tsx@point@#3\endcsname
% Calculate something
\pgfmathsetmacro{\sumofpointsx}{\tsx@point@x+\first@point@x}
}
编辑
您可以这样做,而无需使用自定义命令来定义点。PGF 有命令\pgfextract<x,y,z>
,因此如果您说\coordinate (A) at (1,2,3)
您可以通过以下方式访问这些值:
\newdim\mypointx\pgfextractx{\mypointx}{\pgfpointanchor{A}{center}}
\newdim\mypointy\pgfextracty{\mypointy}{\pgfpointanchor{A}{center}}
\newdim\mypointz\pgfextractz{\mypointz}{\pgfpointanchor{A}{center}}
MWE 使用\pgfextract<x,y,z>
\newdim\lastx\newdim\lasty\newdim\lastz
\newcommand*{\extracXYZ}[1]{%
\pgfextractx{\lastx}{\pgfpointanchor{#1}{center}}
\pgfextracty{\lasty}{\pgfpointanchor{#1}{center}}
\pgfextractz{\lastz}{\pgfpointanchor{#1}{center}}
}
...
\coordinate (A) at (1,2,3);
\coordinate (B) at (3,2,1);
\newcommand*\mynewcommand[2]{
\ectractXYZ{#1}
\let\firstx\lastx
\let\firsty\lasty
\let\firstz\lastz
\ectractXYZ{#2}
% Calculate something
\pgfmathsetmacro{\sumofpointsx}{\firstx+\lastx}
}