我正在尝试绘制一个带有多个箭头的半球。每个箭头上都应该有一个圆圈,该圆圈在箭头的局部坐标系中绘制。我设法绘制了球体和箭头,但我无法正确获得圆圈的透视图。
有什么建议么?
\documentclass[11pt]{article}
\usepackage{tikz}
\usepackage{tikz-3dplot}
\usepackage{verbatim}
\usepackage[active,tightpage]{preview}
\PreviewEnvironment{tikzpicture}
\setlength\PreviewBorder{5pt}%
%: isometric South West : X , South East : Y , North : Z
\tikzset{isometricXYZ/.style={x={(-0.866cm,-0.5cm)}, y={(0.866cm,-0.5cm)}, z={(0cm,1cm)}}}
%% document-wide tikz options and styles
\begin{document}
\begin{tikzpicture} [scale=4, isometricXYZ, line join=round,
opacity=.75, text opacity=1.0,%
>=latex,
inner sep=0pt,%
outer sep=2pt,%
]
\def\h{5}
\newcommand{\quadrant}[2]{
\foreach \f in {85,75,...,5}
\foreach \t in {#1}
\draw [dotted, fill=#2]
({sin(\f - \h)*cos(\t - \h)}, {sin(\f - \h)*sin(\t - \h)}, {cos(\f - \h)})
-- ({sin(\f - \h)*cos(\t + \h)}, {sin(\f - \h)*sin(\t + \h)}, {cos(\f - \h)})
-- ({sin(\f + \h)*cos(\t + \h)}, {sin(\f + \h)*sin(\t + \h)}, {cos(\f + \h)})
-- ({sin(\f + \h)*cos(\t - \h)}, {sin(\f + \h)*sin(\t - \h)}, {cos(\f + \h)})
-- cycle;
}
%Quadrants
\quadrant{130,140,...,310}{gray!2}
\quadrant{-50,-40,...,130}{gray!2}
%View arrows
\def\l{1.15}
\foreach \f in {0,10,...,90}
\foreach \t in {95}
\draw [black, ->, thick]
({\l*sin(\f)*cos(\t)},{\l*sin(\f)*sin(\t)},{\l*cos(\f)})
-- ({sin(\f)*cos(\t)},{sin(\f)*sin(\t)},{cos(\f)});
% Circles in local coordinate system of the arrows
\foreach \f in {0,10,...,90}
\foreach \t in {95}
{
\def\PosX{{\l*sin(\f)*cos(\t)}}
\def\PosY{{\l*sin(\f)*sin(\t)}}
\def\PosZ{{\l*cos(\f)}}
\def\Pos{(\PosX, \PosY, \PosZ)}
\begin{scope}[rotate around={\f:\Pos}]
\draw[->,red,thick] \Pos circle (0.07);
\end{scope}
};
\end{tikzpicture}
\end{document}
目前结果。绘制的圆圈目前看起来不正确。
答案1
最后我编写了一个变换矩阵并手动变换了这些点。
\documentclass[11pt]{article}
\usepackage{tikz}
\usepackage{tikz-3dplot}
%%%<
\usepackage{verbatim}
\usepackage[active,tightpage]{preview}
\PreviewEnvironment{tikzpicture}
\setlength\PreviewBorder{5pt}%
%%%>
\tikzset{isometricXYZ/.style={x={(-0.866cm,-0.5cm)}, y={(0.866cm,-0.5cm)}, z={(0cm,1cm)}}}
%% document-wide tikz options and styles
\begin{document}
\begin{tikzpicture} [scale=4, isometricXYZ, line join=round,
opacity=.75, text opacity=1.0,%
>=latex,
inner sep=0pt,%
outer sep=2pt,%
]
\def\h{5}
\newcommand{\quadrant}[2]{
\foreach \f in {85,75,...,5}
\foreach \t in {#1}
\draw [dotted, fill=#2]
({sin(\f - \h)*cos(\t - \h)}, {sin(\f - \h)*sin(\t - \h)}, {cos(\f - \h)})
-- ({sin(\f - \h)*cos(\t + \h)}, {sin(\f - \h)*sin(\t + \h)}, {cos(\f - \h)})
-- ({sin(\f + \h)*cos(\t + \h)}, {sin(\f + \h)*sin(\t + \h)}, {cos(\f + \h)})
-- ({sin(\f + \h)*cos(\t - \h)}, {sin(\f + \h)*sin(\t - \h)}, {cos(\f + \h)})
-- cycle;
}
\newcommand{\arrowarc}[6]{
\draw[domain=0:320,smooth,variable=\x,->, dashed] plot
({0.07 * (cos(#2)*cos(#3) * cos(\x) + (cos(#3)*sin(#1)*sin(#2) - cos(#1)*sin(#3)) * sin(\x)) + #4},
{0.07 * (cos(#2)*sin(#3) * cos(\x) + (cos(#1)*cos(#3) + sin(#1)*sin(#2)*sin(#3)) * sin(\x)) + #5},
{0.07 * (-sin(#2) * cos(\x) + cos(#2)*sin(#1)* sin(\x)) + #6});
}
%Quadrants
\quadrant{130,140,...,310}{gray!2}
\quadrant{-50,-40,...,130}{gray!2}
\foreach \f in {20,30,...,90}
\foreach \t in {-40,-20,...,120}
{
%Movement arrows
\def\l{1.15}
\draw [black, ->, thick]
({\l*sin(\f)*cos(\t)},{\l*sin(\f)*sin(\t)},{\l*cos(\f)})
-- ({sin(\f)*cos(\t)},{sin(\f)*sin(\t)},{cos(\f)});
% Circles
\def\l{1.12}
\arrowarc{(\f)}{0}{(\t + 90)}{\l*sin(\f)*cos(\t)}{\l*sin(\f)*sin(\t)}{\l*cos(\f)}
};
\end{tikzpicture}
\end{document}][1]