我得到了这个代码:
\begin{tikzpicture}
\draw (0,0) circle (3);
\draw[dashed] (({3*cos(45)},{3*sin(45)}) arc (0:180:{3*cos(45)} and 0.7);
\draw (({3*cos(45)},{3*sin(45)}) arc (0:-180:{3*cos(45)} and 0.7);
\draw[dashed] (({3*cos(30)},{3*sin(30)}) arc (0:180:{3*cos(30)} and 0.7);
\draw (({3*cos(30)},{3*sin(30)}) arc (0:-180:{3*cos(30)} and 0.7);
\draw[dashed] (3,0) arc (0:180:3 and 0.7);
\draw (3,0) arc (0:-180:3 and 0.7);
\draw[dashed] (({3*cos(-30)},{3*sin(-30)}) arc (0:180:{3*cos(-30)} and 0.7);
\draw (({3*cos(-30)},{3*sin(-30)}) arc (0:-180:{3*cos(-30)} and 0.7);
\end{tikzpicture}
生成以下球体:
我的问题是:为什么弧线的边界稍微超出球体?有没有办法解决这个问题,以便我可以让这些弧线位于球体边界内?当然,我知道我可以手动开始测试弧线半径的值来实现我的目标,但我想要一个通用的解决方案。
谢谢!
答案1
这个问题的评论中提供了很好的提示,用于在 3d 中绘制球体及其平行线。但如果只需要平行线,那么有一种简单的方法可以在 2d 中完成。
下面的代码
\documentclass[border=2mm]{standalone}
\usepackage{tikz}
\def\r{2} % sphere radius
\def\k{0.7} % ratio between ellipse axes b/a, 0<k<1
\def\n{31} % number of parallels to draw, n>1
\pgfmathsetmacro\f{sqrt(1-\k*\k)} % relation between a tangent point and its height
\begin{document}
\begin{tikzpicture}
\foreach\i in {1,...,\n}
{%
\pgfmathsetmacro\h{(\i/(\n+1)-0.5)*2*\r*\f} % parallel height
\pgfmathsetmacro\y{\h/\f/\f} % tangent point y
\pgfmathsetmacro\a{sqrt(\r*\r-\y*\y+(\y-\h)*(\y-\h)/(\k*\k))} % semi-major axis
\pgfmathsetmacro\b{\k*\a} % semi-minor axis
\begin{scope} % front parallels, both spheres
\clip (-\r,\y) rectangle (3.5*\r,-\r);
\draw (0,\h) ellipse (\a cm and \b cm); % left sphere (parallels)
\draw (2.5*\r,\h) ellipse (\a cm and \b cm); % right sphere (parallels)
\end{scope}
\begin{scope} % back parallels, right sphere
\clip (-\r,\y) rectangle (3.5*\r,\r);
\draw[thin,gray!50] (2.5*\r,\h) ellipse (\a cm and \b cm);
\end{scope}
}
\draw[thick,red] (0,0) circle (\r); % left sphere
\draw[thick,red] (2.5*\r,0) circle (\r); % right sphere
\end{tikzpicture}
\end{document}
数学提示
设x^2+y^2=r^2
是球体的二维投影,x^2/a^2+(y-h)^2/b^2=1
是高度为的平行线的二维投影h
。固定b=ka
给k
定(所有椭圆的轴比必须相同k
)。假设两条曲线都有一个公共切点(例如,取导数并使其相等),我们得到y
该切点坐标的表达式。然后我们找到a
(半长轴)的值,使得椭圆通过该点。现在,由于b=ka
,我们有了椭圆的方程。我们也可以计算绘制弧的角度,而不是剪切椭圆,但在这种情况下,我认为剪切比数学更容易。