答案1
在等待 TikZ 助手时,这里有一个元帖子版本。这在 MP 中几乎是一行代码。
\documentclass[border=5mm]{standalone}
\usepackage{luamplib}
\begin{document}
\mplibtextextlabel{enable}
\begin{mplibcode}
vardef elliptic_path(expr a, b, minor_radius) =
fullcircle xscaled abs(a-b) yscaled 2 minor_radius
rotated angle (a-b) shifted 1/2[a,b]
enddef;
beginfig(1);
pair P, Q; numeric r;
P = origin; Q = 89 dir 42;
r = 34;
path e;
e = elliptic_path(P, Q, r);
draw e withpen pencircle scaled 1.414 withcolor 3/4 white;
drawarrow subpath (1, 5) of e withcolor red;
dotlabel.lft("$P$", P);
dotlabel.rt("$Q$", Q);
endfig;
\end{mplibcode}
\end{document}
这是luamplib
用lualatex
引擎编译的。
答案2
我认为这有点像 xy 问题。从长远来看,你可能想要的是将你变换到一个坐标系中,该坐标系的中心是两点之间的中心,x 轴从中心指向两点之一,y 轴正交且长度为r
。然后,此坐标系中的圆变成椭圆、普通圆弧、椭圆弧等。显然,Ti钾Z 开箱即用。为了让事情更方便一点,我添加了一种样式,elli cs
它从这些数据中安装这个坐标系。有了这个样式,图表就变得很简单了
\begin{scope}[elli cs={A={(P)},B={(Q)},r=9mm}]
\draw circle[radius=1];
\draw[dashed] (0,1) -- node[midway,fill=white]{$r$} (0,0) node[dot] {}
-- node[midway,fill=white]{$R$} (1,0);
\draw[blue,-{Stealth[bend]}] (-30:1) arc[start angle=-30,end angle=120,radius=1];
\end{scope}
如您所见,对于弧线,无需猜测,角度在此坐标系中具有非常直观的解释。您可以非常方便地在此框架中执行许多进一步的操作,并根据它转换形状。
\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{arrows.meta,bending,calc}
\begin{document}
\begin{tikzpicture}[dot/.style={circle,fill,inner sep=1pt},thick,
elli cs/.code={
\tikzset{ellipse through/.cd,#1}
\def\pv##1{\pgfkeysvalueof{/tikz/ellipse through/##1}}%
\edef\temp{\noexpand\tikzset{shift={($0.5*\pv{A}+0.5*\pv{B}$)},
x={($0.5*\pv{B}-0.5*\pv{A}$)},
y={($($\pv{A}!\pv{r}!90:\pv{B}$)-\pv{A}$)}
}}%
\temp
},
ellipse through/.cd,r/.initial=5mm,A/.initial={(-1,0)},
B/.initial={(1,0)}]
\path[nodes=dot] (0,0) node[label=below left:$P$] (P){}
(4,1.5) node[label=below right:$Q$] (Q){};
\begin{scope}[elli cs={A={(P)},B={(Q)},r=9mm}]
\draw circle[radius=1];
\draw[dashed] (0,1) -- node[midway,fill=white]{$r$} (0,0) node[dot] {}
-- node[midway,fill=white]{$R$} (1,0);
\draw[blue,-{Stealth[bend]}] (-30:1) arc[start angle=-30,end angle=120,radius=1];
\end{scope}
\end{tikzpicture}
\end{document}