在 3D 中查找圆柱切线

在 3D 中查找圆柱切线

我正在尝试绘制一个基于半圆柱的复杂形状。我使用它tikz-3dplot来准确地在除平面之外的平面上绘制弧线xy并很好地设置视角。现在我需要找到该圆柱上的切线,以便能够填充可见的前部区域。根据这个问题,我尝试计算圆弧在垂直于圆柱轴的方向上达到最大值的角度(此处y)。不幸的是,我无法使用此角度在旋转坐标系中绘制圆弧,因为我需要先对其进行变换...

以下代码应该能让事情更清楚。它绘制了法线和旋转坐标系的轴以及圆柱形状的一个圆弧。我需要找到该圆弧的切线,以便沿 - 轴方向拉伸形状y

\documentclass[tikz]{standalone}
\usepackage{tikz-3dplot}
\begin{document}
\tdplotsetmaincoords{55}{40}
\begin{tikzpicture}[tdplot_main_coords]

    % find directions of projection
    \path (1,0,0);
    \pgfgetlastxy{\axisxx}{\axisxy}
    \path (0,1,0);
    \pgfgetlastxy{\axisyx}{\axisyy}
    \path (0,0,1);
    \pgfgetlastxy{\axiszx}{\axiszy}
    % angle of tangent
    \pgfmathsetmacro{\tangang}{atan(-\axisyy/\axisyx)+180}

    \draw[->] (0, 0, 0) -- (4, 0, 0) node (x) [anchor=north] {x};
    \draw[->] (0, 0, 0) -- (0, 4, 0) node (y) [anchor=north] {y};
    \draw[->] (0, 0, 0) -- (0, 0, 4) node [anchor=east] (z) {z};

    %set theta plane to xz-plane
    \tdplotsetthetaplanecoords{0}

    \draw[tdplot_rotated_coords, red, ->] (0, 0, 0) -- (2, 0, 0) node [anchor=east] (xx) {x'};
    \draw[tdplot_rotated_coords, red, ->] (0, 0, 0) -- (0, 2, 0) node [anchor=north] (yy) {y'};

    \draw[tdplot_rotated_coords] (0, 0, 0) + (90:5) arc (90:270:5);

    \draw[red, ->] (0, 0) -- ++(7*\axisyy, -7*\axisyx);
    \draw[tdplot_rotated_coords, red, dashed, ->] (0, 0, 0,) -- ++(\tangang:5);
\end{tikzpicture}
\end{document}

正如您在该代码的输出中所看到的,计算的角度很好地找到了切线的位置(红线),但如果在旋转的坐标系中使用该角度,则我无法找到绘制切线的正确位置(虚线红线)。

在此处输入图片描述

有人知道在使用时如何寻找切线吗tikz-3dplot

答案1

矩阵代数

不幸的是,像 calc 库这样的东西只能在屏幕单位下工作,对于这个问题没有理由回头(虽然我确实验证了转换是否有效)。

相反,我使用交叉点 tikzlibrary 找到了与圆弧垂直的交点。

\documentclass[tikz]{standalone}
\usepackage{tikz-3dplot}
\usetikzlibrary{calc,intersections}
\begin{document}
\tdplotsetmaincoords{55}{40}
\begin{tikzpicture}[tdplot_main_coords]

    \draw[->] (0, 0, 0) -- (4, 0, 0) node (x) [anchor=north] {x};
    \draw[->] (0, 0, 0) -- (0, 4, 0) node (y) [anchor=north] {y};
    \draw[->] (0, 0, 0) -- (0, 0, 4) node [anchor=east] (z) {z};

    %set theta plane to xz-plane
    \tdplotsetthetaplanecoords{0}

    \draw[tdplot_rotated_coords, red, ->] (0, 0, 0) -- (2, 0, 0) node [anchor=east] (xx) {x'};
    \draw[tdplot_rotated_coords, red, ->] (0, 0, 0) -- (0, 2, 0) node [anchor=north] (yy) {y'};

    \draw[tdplot_rotated_coords, name path=myarc] (0, 0, 0) + (90:5) arc (90:270:5);

    \path[name path=myline] (0,0,0) -- ($(0,0,0)!7!-90:(0,1,0)$);
    \path[name intersections={of=myarc and myline}] coordinate (A) at (intersection-1);

    \draw[->] (0,0,0) -- (A);

    \draw (A) -- ++(0,4,0);

\end{tikzpicture}
\end{document}

圆柱边缘

答案2

我认为我找到了一个计算实际角度的解决方案:

我计算了旋转轴的投影,类似于之前对原始 3D 坐标系所做的操作。然后,我计算了 - 轴x(此处为y'- 轴)与图像平面水平线的角度alpha_k。我使用此角度计算旋转坐标系中的直角(alpha_k, rot)。

\documentclass[tikz]{standalone}
\usepackage{tikz-3dplot}
\begin{document}
\tdplotsetmaincoords{55}{40}
\begin{tikzpicture}[tdplot_main_coords]

    %set theta plane to xz-plane
    \tdplotsetthetaplanecoords{0}

    % find directions of projection
    \path (1,0,0);
    \pgfgetlastxy{\axisxx}{\axisxy}
    \path (0,1,0);
    \pgfgetlastxy{\axisyx}{\axisyy}
    \path (0,0,1);
    \pgfgetlastxy{\axiszx}{\axiszy}
    % angle of tangent
    \pgfmathsetmacro{\tanang}{atan(-\axisyy/\axisyx)+180}

    % find directions of projection in rotated system
    \path[tdplot_rotated_coords] (1,0,0);
    \pgfgetlastxy{\raxisxx}{\raxisxy}
    \path[tdplot_rotated_coords] (0,1,0);
    \pgfgetlastxy{\raxisyx}{\raxisyy}
    \path[tdplot_rotated_coords] (0,0,1);
    \pgfgetlastxy{\raxiszx}{\raxiszy}
    % angle of tangent
    \pgfmathsetmacro{\rtang}{atan(-\raxiszy/\raxiszx)+180}
    \pgfmathsetmacro{\angkorr}{atan(\raxisyy/\raxisyx)}
    \pgfmathsetmacro{\rtanang}{\rtang+\angkorr/2}

    \draw[->] (0, 0, 0) -- (4, 0, 0) node (x) [anchor=north] {x};
    \draw[->] (0, 0, 0) -- (0, 4, 0) node (y) [anchor=north] {y};
    \draw[->] (0, 0, 0) -- (0, 0, 4) node [anchor=east] (z) {z};
    \draw[->, dashed] (0, 0) -- (4*\axisyy, -4*\axisyx);

    \draw[tdplot_rotated_coords, red, ->] (0, 0, 0) -- (2, 0, 0) 
        node [anchor=east] (xx) {x'};
    \draw[tdplot_rotated_coords, red, ->] (0, 0, 0) -- (0, 2, 0)
        node [anchor=north] (yy) {y'};
    \draw[tdplot_rotated_coords, red, dashed]
        (0, 0) + (90:2) arc [start angle=90-\angkorr, delta angle=\angkorr, radius=2]
        node [anchor=north west] (angkorr) {\tiny$\alpha_k$}
        -- (0, 0);

    \draw[tdplot_rotated_coords] (0, 0, 0) + (90:5) arc (90:270:5);

    \draw[red, ->] (0, 0) -- ++(7*\axisyy, -7*\axisyx)
        node [anchor=west] (tanang) {\tiny$\alpha_t$};
    \draw[tdplot_rotated_coords, red, dashed, ->] (0, 0, 0,) -- ++(\tanang:5);
    \draw[tdplot_rotated_coords, dashed, ->] (0, 0, 0,) -- ++(\rtang:5)
        node [anchor=north] (tanangrot) {\tiny$\alpha'_t$};
    \draw[tdplot_rotated_coords, dotted] (0, 0, 0,) -- ++(\rtanang:5)
        node [anchor=west] (rtanang) {\tiny$\alpha_t^{rot} = \alpha_t+\alpha_k/2$}
        -- ++(0, 0, 3);

\end{tikzpicture}
\end{document}

请注意,在这里介绍的例子中,由于旋转后的xy-平面等于原始xz-平面(theta等于0度数),因此从原始坐标系的投影开始,我将获得相同的结果。但是,只要theta不同于零,我就需要使用旋转后的轴。 在此处输入图片描述

我认为原始系统和旋转系统的角度存在微小偏差。我还不确定这是计算错误还是我的思路存在小缺陷……

相关内容