在 3D 非平面上绘制一个圆圈 - Tikz

在 3D 非平面上绘制一个圆圈 - Tikz

因此,我尝试使用 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}

结果

相关内容