平均能量损失

平均能量损失

我发现来自用户 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@xy并且z,一旦你调用\csname tsx@point@#2 \endcsname它定义它们再次覆盖先前的值,因此只剩下最后发出的坐标tsx@point@#1

解决此问题的一种方法是在调用另一个之前对和\let\first@point@x\tsx@point@x进行依此类推,然后您可以通过持有人访问第一个声明的点。yz\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}
}

相关内容