我正在尝试绘制一个基于半圆柱的复杂形状。我使用它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
不同于零,我就需要使用旋转后的轴。
我认为原始系统和旋转系统的角度存在微小偏差。我还不确定这是计算错误还是我的思路存在小缺陷……