我尝试radial metric
使用pgfplots
和来表示球tikz
。
Radial metric
是metric d
:R^2
d( (a,b), (x,y) ) = p( (a,b), (x,y) ) if bx = ay
d( (a,b), (x,y) ) = p( (a,b), (0,0) ) + p( (0,0), (x,y) ) if bx =/= ay
欧氏距离为p
,因此可以将其重写如下:
d( (a,b), (x,y) ) = sqrt( (x-a)^2 + (y-b)^2 ) if bx = ay
d( (a,b), (x,y) ) = sqrt(a^2 + b^2) + sqrt(x^2 + y^2) if bx =/= ay
我在 desmos 中画了个图,你可以看到任意球体以任意圆心为半径的形状这里
我想为这些球写一个通用表达式,这样,如果我想绘制两个不同的球,为了绘制第二个球,我唯一要做的就是改变第一个球的中心和半径。
我读过一些关于使用绘制隐函数的帖子tikz
,但我看不出有什么方法可以帮助我。
答案1
这是第一次尝试。
\documentclass[border=3mm,tikz]{standalone}
\usetikzlibrary{calc,math}
\usetikzlibrary {shapes.misc}
\usepackage{pgfplots}
\pgfplotsset{compat=1.17}
\newcommand{\dcircl}[3]{
\tikzmath{
\myr = #1;
\mya = #2;
\myb = #3;
\p1 = ifthenelse(\mya==0, 0, \mya + sqrt((\mya^2 * \myr^2)/(\mya^2 + \myb^2)));
\q1 = ifthenelse(\mya==0, \myb + \myr, \p1 * (\myb / \mya));
\p2 = ifthenelse(\mya==0, 0, \mya - sqrt((\mya^2 * \myr^2)/(\mya^2 + \myb^2)));
\q2 = ifthenelse(\mya==0, \myb - \myr, \p2 * (\myb / \mya));
\d1 = veclen(\mya,\myb);
\radius = ifthenelse(\d1 < \myr, \myr - \d1, 0);
}
\draw[dashed,green!50!black,fill=green!80!black,opacity=0.4] (0,0) circle[radius=\radius];
\node[inner sep=2pt,cross out,draw] at (axis cs:\mya,\myb){};
\draw[red,opacity=0.5] (axis cs:\p1,\q1) -- (axis cs:\p2,\q2);
\filldraw[fill=white,draw=red,draw opacity=0.7] (axis cs:\p1,\q1) circle[radius=2pt];
\filldraw[fill=white,draw=red,draw opacity=0.7] (axis cs:\p2,\q2) circle[radius=2pt];
}
\begin{document}
\begin{tikzpicture}[line width=1pt]
\begin{axis}[
axis y line=center,
axis x line=center,
axis equal,
xmin=-6, xmax=6, ymin=-6.5, ymax=6.5
]
\dcircl{3.2}{1.7}{0.8}%dcircl{r}{a}{b}
\end{axis}
\end{tikzpicture}
\end{document}