tikz-3dplot:如何以给定角度绘制球体的小圆圈?

tikz-3dplot:如何以给定角度绘制球体的小圆圈?

以特定角度绘制小圆圈的正确方法是什么?

我只能即兴发挥以找到正确的角度。

在此处输入图片描述

提示:我想画这样的图:

在此处输入图片描述

\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} 

演示

相关内容