在 tikz 3d 中获取给定向量的单位向量的最佳方法

在 tikz 3d 中获取给定向量的单位向量的最佳方法

假设我在 tikz 3d 中有一个坐标,我将其解释为矢量,例如

\coordinate (v) at (3,2,9);

让单位向量指向同一方向的最佳方法是什么?

我的第一个想法是使用let语法,但这在 3d 中不起作用。

例如

\path let \p1 = (v) in ($1/(x1^2 + x2^2 + x3^3)^(0.5)*(v)$) coordinate (vv);

无论如何,我正在寻找一种比使用let这个更易于使用的解决方案......

答案1

这个怎么样:

代码

\documentclass[parskip]{scrartcl}
\usepackage[margin=15mm]{geometry}
\usepackage{tikz}
\usetikzlibrary{arrows,calc}

\newcommand{\unitvec}[3][->]% [options], start point, vector
{   \xdef\mysum{0}
    \foreach \c in  {#3}
    {   \pgfmathsetmacro{\mysquare}{\mysum+pow(\c,2)}
        \xdef\mysum{\mysquare}
    }
    \pgfmathsetmacro{\myveclen}{sqrt(\mysum)}
    \draw[#1] (#2) -- ($1/\myveclen*(#3)$);
}

\begin{document}

\begin{tikzpicture}
\draw[-latex] (0,0,0) -- (3,6,2);
\unitvec[-latex,red,thick]{0,0,0}{3,6,2}

\draw[->] (0,0,0) -- (-2,4,3);
\unitvec[->,blue,thick]{0,0,0}{-2,4,3}

\draw[-stealth] (0,0,0) -- (-1,-4,-1);
\unitvec[-stealth,green,thick]{0,0,0}{-1,-4,-1}
\end{tikzpicture}

\end{document}

输出

在此处输入图片描述


编辑1:这是带有新 的版本\Coordinate(<name>)(<vector>)。要运行它,现在需要\Unitvec,因为\unitvec仅适用于直接数字。

代码

\documentclass[parskip]{scrartcl}
\usepackage[margin=15mm]{geometry}
\usepackage{tikz}
\usetikzlibrary{arrows,calc}

\def\Coordinate(#1)(#2)% name, vector
{   \expandafter\xdef\csname#1\endcsname{#2}
    \coordinate (#1) at (#2);
}

% for use with \Coordinates
\newcommand{\Unitvec}[3][->]% [options], start point, vector
{   \xdef\mysum{0}
    \foreach \myconstant [count=\mycount] in    #3
    {   \pgfmathsetmacro{\mysquare}{\mysum+pow(\myconstant,2)}
        \xdef\mysum{\mysquare}
    }
    \pgfmathsetmacro{\myveclen}{sqrt(\mysum)}
    \draw[#1] (#2) -- ($1/\myveclen*(#3)$);
}

%for use with direct numbers, e.g. \unitvec[-latex,red,thick]{0,0,0}{3,6,2}
\newcommand{\unitvec}[3][->]% [options], start point, vector
{   \xdef\mysum{0}
    \foreach \c in  {#3}
    {   \pgfmathsetmacro{\mysquare}{\mysum+pow(\c,2)}
        \xdef\mysum{\mysquare}
    }
    \pgfmathsetmacro{\myveclen}{sqrt(\mysum)}
    \draw[#1] (#2) -- ($1/\myveclen*(#3)$);
}

\begin{document}

\begin{tikzpicture}
\Coordinate(o)(0,0,0)
\Coordinate(a)(3,6,2)
\Coordinate(b)(-2,4,3)
\Coordinate(c)(-1,-4,-1)

\draw[-latex] (o) -- (a);
\Unitvec[-latex,red,thick]{\o}{\a}

\draw[->] (o) -- (b);
\Unitvec[->,blue,thick]{\o}{\b}

\draw[-stealth] (o) -- (c);
\Unitvec[-stealth,green,thick]{\o}{\c}

\end{tikzpicture}

\end{document}

输出

和以前一模一样。

请注意:

\Coordinate用于\xdef存储向量,因此它会毫不犹豫地覆盖现有命令。此外,它使用命令,因此您必须写\a而不是a。它还会创建一个常规的\coordinate。如果您只需要画布上的点,则可以使用a(如\draw命令中所示),如果真正的 3D 位置很重要,则应使用\a(如)。此外,在坐标名称中使用或\unitvec之类的东西,在 中有效,但不能在 中使用,因此只能使用字母。-8TikZedef

相关内容