![tikz-3dplot:如何以给定角度绘制球体的小圆圈?](https://linux22.com/image/399255/tikz-3dplot%EF%BC%9A%E5%A6%82%E4%BD%95%E4%BB%A5%E7%BB%99%E5%AE%9A%E8%A7%92%E5%BA%A6%E7%BB%98%E5%88%B6%E7%90%83%E4%BD%93%E7%9A%84%E5%B0%8F%E5%9C%86%E5%9C%88%EF%BC%9F.png)
以特定角度绘制小圆圈的正确方法是什么?
我只能即兴发挥以找到正确的角度。
提示:我想画这样的图:
\documentclass[margin=5mm, tikz]{standalone}
\usepackage{amsmath, amsfonts}
\usepackage{tikz}
\usepackage{tikz-3dplot}
\usetikzlibrary{arrows,calc,backgrounds}
\begin{document}
\pgfmathsetmacro{\r}{2.6} %
\tdplotsetmaincoords{60}{110}
\begin{tikzpicture}[
tdplot_main_coords,
%tdplot_rotated_coords,
font=\footnotesize,
Helpcircle/.style={gray!70!black,
%densely dashed
},
]
\pgfmathsetmacro{\h}{0.9*\r} %
\coordinate[label=$M$] (M) at (0,0,0);
\coordinate[label=$S$] (S) at (0,0,\h);
\draw[Helpcircle] (M) circle[radius=\r];
\draw[Helpcircle] ([shift={(0,0,\h)}]M) circle[radius=sqrt(\r^2-\h^2)];
\draw[Helpcircle, rotate=90, red] (0,0,-\h) coordinate[label=$A$] (A) circle[radius=sqrt(\r^2-\h^2)];
\draw[] (M) -- (A);
\pgfmathsetmacro{\teta}{30} %
\pgfmathsetmacro{\y}{-\h*cos(\teta)} %
\draw[blue] (M) -- ([xshift=\r cm, yshift=\y cm]M);
% Sphere
\begin{scope}[tdplot_screen_coords, on background layer]
\fill[ball color= gray!20, opacity = 0.25] (M) circle (\r);
\end{scope}
%% Points
\foreach \P in {M,S, A}{
\shade[ball color=white] (\P) circle (1.75pt);
}
\begin{scope}[-latex, shift={(M)}, xshift=1.5*\r cm, yshift=0.1*\r cm]
\foreach \P/\s/\Pos in {(1,0,0)/x/right, (0,1,0)/y/below, (0,0,1)/z/right}
\draw[] (0,0,0) -- \P node[\Pos, pos=0.9,inner sep=2pt]{$\s$};
\end{scope}
\end{tikzpicture}
\end{document}
答案1
(A)
这说明如何使用 3D 坐标在 处绘制圆圈,假设您想要(A)
在 处绘制圆圈(0,\h,0)
。
使用旋转坐标可能比较棘手。第一个角度旋转 XY 平面,对 Z 轴没有影响。第二个角度在(新的)XZ 平面中旋转,对(新的)Y 轴没有影响。尽量避免使用第三个角度,因为它在新的 XY 平面中旋转,尽管有些变换只能通过这种方式完成;例如\tdplotsetrotatedcoords{90}{90}{-90}
。
请注意,转换不是累积的。
顺便说一句,\r^2
使用exp(2*log(\r))
它来计算很慢并且仅适用于正数。
\documentclass[margin=5mm, tikz]{standalone}
\usepackage{amsmath, amsfonts}
\usepackage{tikz}
\usepackage{tikz-3dplot}
\usetikzlibrary{arrows,calc,backgrounds}
\begin{document}
\pgfmathsetmacro{\r}{2.6} %
\tdplotsetmaincoords{60}{110}
\begin{tikzpicture}[
tdplot_main_coords,
%tdplot_rotated_coords,
font=\footnotesize,
Helpcircle/.style={gray!70!black,
%densely dashed
},
]
\pgfmathsetmacro{\h}{0.9*\r} %
\coordinate[label=$M$] (M) at (0,0,0);
\coordinate[label=$S$] (S) at (0,0,\h);
\coordinate[label=$A$] (A) at (0,\h,0);
\draw[Helpcircle] (M) circle[radius=\r];
\draw[Helpcircle] (S) circle[radius=sqrt(\r*\r-\h*\h)];% much faster then ^2
\tdplotsetrotatedcoords{90}{90}{0}%
\draw[Helpcircle, red, tdplot_rotated_coords] (A) circle[radius=sqrt(\r*\r-\h*\h)];
\draw[] (M) -- (A);
% Sphere
\begin{scope}[tdplot_screen_coords, on background layer]
\fill[ball color= gray!20, opacity = 0.25] (M) circle (\r);
\end{scope}
%% Points
\foreach \P in {M,S, A}{
\shade[ball color=white] (\P) circle (1.75pt);
}
\begin{scope}[-latex, shift={(M)}, xshift=1.5*\r cm, yshift=0.1*\r cm]
\foreach \P/\s/\Pos in {(1,0,0)/x/right, (0,1,0)/y/below, (0,0,1)/z/right}
\draw[] (0,0,0) -- \P node[\Pos, pos=0.9,inner sep=2pt]{$\s$};
\end{scope}
\end{tikzpicture}
\end{document}