因此,我尝试使用 TikZ 在非标准平面上绘制一个圆圈,但似乎找不到任何文档。我最初尝试了在这里找到的内容:使用 TikZ 在非 x-平面上绘制圆圈但这并没有回答我的问题,因为这只是从一个平面变为另一个平面。有没有办法构建一个“新平面”来放置圆圈?
例如。假设我有 2 个顶点 (-1,1,3) 和 (1, -2, 7),它们既不在 xy、yz 也不在 xz 平面上,我想构造一个以原点 (0,0,0) 为中心的圆,但位于由这两个点和原点构成的平面上。(为了任意起见,假设半径为 1cm)
有没有办法用 tikz 来做到这一点,或者我的飞机只能放在画布上?
注意:我更喜欢 tikz 而不是 ps,因为我用 tikz 做其他所有事情,并且这个图像需要存在于已经构建的 tikz 图像中。
此外,这里是我所包含的库:
\usepackage{tikz, tikz-3dplot, pgfplots}
\usetikzlibrary{fit}
但我愿意根据需要添加其他库。谢谢。
最小示例
\documentclass[12pt]{article}
\usepackage{tikz, tikz-3dplot, pgfplots}
\usetikzlibrary{fit}
\begin{document}
\tdplotsetmaincoords{0}{0}
\begin{tikzpicture}%
%% Coordinate of the vertices:
%%
\coordinate (one) at (-3, -1, 2);
\coordinate (two) at (-3, -2, 1);
%% Planes
\coordinate (O) at (0,0,0);
\coordinate (x) at (1,0,0);
\coordinate (y) at (0,1,0);
\coordinate (z) at (0,0,1);
%% Axes
\draw[->] (O) -- (x) node [right] {$x$};
\draw[->] (O) -- (y) node [right] {$y$};
\draw[->] (O) -- (z) node [right] {$z$};
%% Want a circle on the plane which contains the following two vectors.
\draw[->,thick] (O) -- (one);
\draw[->,thick] (O) -- (two);
\end{tikzpicture}
\end{document}
答案1
所以,你需要一点数学知识。
首先,让我们找出旋转框架在参考框架中的表达。我假设(one)
是旋转的x
(你必须对其进行标准化)。为了清楚起见,我假设
\coordinate(one) at (1/2, 1/2, -{1/\sqrt(2)})
\coordinate(two) at (1/2, 1/2, {1/\sqrt(2)})
然后你得到旋转框架的第三个向量,它是前两个向量的叉积:
\coordinate(three) at (-{1/\sqrt(2)}, {1/\sqrt(2)}, 0)
这将为您提供从旋转框架到参考框架的旋转矩阵:
1/2 1/2 -{1/\sqrt(2)}
1/2 1/2 {1/\sqrt(2)}
{1/\sqrt(2)} {1/\sqrt(2)} 0
从参考系到旋转系的旋转矩阵是其转置:
1/2 1/2 {1/\sqrt(2)}
1/2 1/2 {1/\sqrt(2)}
-{1/\sqrt(2)} {1/\sqrt(2)} 0
因此(例如,遵循 Diebel,2006,表示姿态:欧拉角、单位四元数和旋转向量。此外,我犯了一个小错误,tikz-3dplot 假设 zyz 欧拉约定,而我使用的 5.5.3 中的 Diebel 假设 zxz。但无论如何,似乎在那种特殊情况下有效 ^^)你有欧拉序列的三个角度
\phi = atan2(r13, r23)
\theta = acos(r33)
\psi = atan2(r31, -r32)
在我们的例子中:
\phi = -45
\theta = 90
\psi = 135
(请注意,我可能在角度评估中犯了一个愚蠢的错误,因为在我的推理中,phi 和 psi 上的符号被交换了)因此,更新您的代码,使用tdplot_rotated_coords
,我们得到:
tdplot_main_coords
(请注意,在您的 中添加了tikzpicture
,您的\tdplotsetmaincoords
是无效的)
\documentclass{standalone}
\usepackage{tikz, tikz-3dplot}
\usetikzlibrary{calc}
\begin{document}
\tdplotsetmaincoords{50}{30}
\begin{tikzpicture}[tdplot_main_coords]%
%% Coordinate of the vertices:
%%
\coordinate (one) at (1/2, 1/2, {1/sqrt(2)});
\coordinate (two) at (1/2, 1/2, -{1/sqrt(2)});
\coordinate (three) at (-{1/sqrt(2)}, {1/sqrt(2)}, 0);
%% Planes
\coordinate (O) at (0,0,0);
\coordinate (x) at (1,0,0);
\coordinate (y) at (0,1,0);
\coordinate (z) at (0,0,1);
%% Axes
\draw[->] (O) -- (x) node [right] {$x$};
\draw[->] (O) -- (y) node [right] {$y$};
\draw[->] (O) -- (z) node [right] {$z$};
%% Want a circle on the plane which contains the following two vectors.
\draw[->,thick] (O) -- (one);
\draw[->,thick] (O) -- (two);
\draw[->,thick] (O) -- (three);
\tdplotsetrotatedcoords{-45}{90}{135}
\begin{scope}[tdplot_rotated_coords]
\draw (0,0,0) circle (1);
\end{scope}
\end{tikzpicture}
\end{document}