假设我在 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
之类的东西,在 中有效,但不能在 中使用,因此只能使用字母。-
8
TikZ
edef