Tenemos una esfera de radio $R$ con centro en el origen, y de tres puntos
$$\vec{p}_1 = \left [ \begin{matrix} x_1 \\ y_1 \\ z_1 \end{matrix} \right ], \quad \vec{p}_2 = \left [ \begin{matrix} x_2 \\ y_2 \\ z_2 \end{matrix} \right ], \quad \vec{p}_3 = \left [ \begin{matrix} x_3 \\ y_3 \\ z_3 \end{matrix} \right ]$$
en la esfera, es decir,$\lVert\vec{p}_1\rVert = R$, $\lVert\vec{p}_2\rVert = R$, y $\lVert\vec{p}_3\rVert = R$.
Los tres puntos forman un plano con normal $\vec{n}$,
$$\vec{n} = (\vec{p}_2 - \vec{p}_1) \times (\vec{p}_3 - \vec{p}_1) \tag{1}\label{NA1}$$
donde $\times$ representa la cruz del producto. Por simplicidad, vamos a utilizar una unidad de vector normal $\hat{n}$, $\lVert\hat{n}\rVert = 1$:
$$\hat{n} = \left [ \begin{matrix} x_n \\ y_n \\ z_n \end{matrix} \right ] = \frac{\vec{n}}{\left\lVert\vec{n}\right\rVert} \tag{2}\label{NA2}$$
Tenga en cuenta que si $\lVert\vec{n}\rVert = 0$, los tres puntos son colineales, o dos o más tienen el mismo sistema de coordenadas.
El avión está a una distancia $d$ de origen:
$$d = \hat{n} \cdot \vec{p}_1 = \hat{n} \cdot \vec{p}_2 = \hat{n} \cdot \vec{p}_3 \tag{3}\label{NA3}$$
donde $\cdot$ representa el producto escalar. (En un programa de ordenador, puede utilizar cualquiera de los tres; puede ser que difieren por error de redondeo.)
La intersección entre el plano y la esfera es un círculo, con centro de $\vec{c}$ y radio de $r$,
$$\vec{c} = \left [ \begin{matrix} x_c \\ y_c \\ z_c \end{matrix} \right ] = d \hat{n}, \quad r = \sqrt{R^2 - d^2} = \left\lVert\vec{p}_1 - \vec{c}\right\rVert = \left\lVert\vec{p}_2 - \vec{c} \right\rVert = \left\lVert \vec{p}_3 - \vec{c} \right\rVert \tag{4}\label{NA4}$$
My suggested approach would be to construct a 2D coordinate system, where the unit circle corresponds to the above circle, with the first axis towards $\vec{p}_1$, and the second axis so that $\vec{p}_2$ is in the positive half-plane.
The origin is obviously at $\vec{c}$. The $u$ eje vector unitario es
$$\hat{u} = \left [ \begin{matrix} x_u \\ y_u \\ z_u \end{matrix} \right ] = \vec{p}_1 - \vec{c} \tag{5}\label{NA5}$$
Tenga en cuenta que, por definición, $\left\lVert\hat{u}\right\rVert = r$.
El $v$ unidad de eje de vector es perpendicular a la normal del plano $\vec{n}$ e las $u$ eje vector unitario; también tenemos que seleccionar su signo (lateralidad), de modo que $\vec{p}_2$ positivo $v$ coordinar. Así, en primer lugar calculamos el producto cruzado, y la escala a la longitud adecuada:
$$\hat{q} = r \frac{\vec{n} \times \hat{u}}{\left\lVert\vec{n}\times\hat{u}\right\rVert} = \hat{n} \times \hat{u}\tag{6}\label{NA6}$$
A continuación, recogemos su dirección (diestro o zurdo, o el signo de $v$ coordenadas), de modo que $\vec{p}_2$ positivo $v$ coordinar:
$$\hat{v} = \left [ \begin{matrix} x_v \\ y_v \\ z_v \end{de la matriz} \right ] = \begin{cases}
\hat{q}, & (\vec{p}_2 - \vec{c}) \cdot \hat{q} \gt 0 \\
-\hat{q}, & \text{otherwise} \end{casos} \etiqueta{7}\label{NA7}$$
Tenga en cuenta que $\vec{p}_2$ puede tener un cero $v$ coordinar sólo si es contrario a $\vec{p}_1$ sobre el círculo; y por OP definición, que requeriría $\vec{p}_3 = \vec{p}_1$, en cuyo caso no tendríamos un avión.
En este punto, tenemos un sistema de coordenadas 2D $(u, v)$:
$$\vec{p} = \vec{c} + u \hat{u} + v \hat{v} \tag{8a}\label{NA8a}$$
y a la inversa
$$\left\lbrace\begin{aligned}
u &= \frac{(\vec{p} - \vec{c}) \cdot \hat{u}}{r^2} \\
v &= \frac{(\vec{p} - \vec{c}) \cdot \hat{v}}{r^2} \\
\end{aligned}\right.\la etiqueta{8}\label{NA8b}$$
Tenemos que calcular la dirección de la $\vec{p}_3$ en este círculo. La mayoría de los lenguajes de programación proporcionan una atan2(y, x)
función que calcula el $\arctan(y/x)$ excepto incluyendo el cuadrante de $(x, y)$; es decir, con el resultado de cubrimiento completo de 360°. Esencialmente,
$$\theta^\prime = \operatorname{atan2}\bigl( (\vec{p}_3 - \vec{c})\cdot\hat{v} ,\, (\vec{p}_3 -\vec{c})\cdot\hat{u} \bigr) \tag{9}\label{NA9}$$
mencionar que, dado que ambos componentes están divididos por $r^2$, podemos omitir ambas divisiones.
Ya hemos definido el sistema de coordenadas 2D de manera que la rotación en sentido antihorario se inicia a partir de $\vec{p}_1$, luego llega a $\vec{p}_2$, y, finalmente,$\vec{p}_3$, necesitamos un positivo $\theta$. Por lo tanto,
$$\theta = \begin{cases}
\theta^\prime + 360°, & \theta^\prime \lt 0 \\
\theta^\prime, & \text{otherwise} \end{casos} \etiqueta{10}\label{NA10}$$
If we now want to parametrise the arc using $t$ as the arc length parameter, $0 \le t \le 1$, so that $\vec{P}(0) = \vec{p}_1$, $\vec{P}(0.5) = \vec{p}_2$, $\vec{P}(1) = \vec{p}_3$, we simply use $u = \cos(t\theta)$, $v = \sin(t\theta)$. En resumen,
$$\vec{P}(t) = \vec{c} + \hat{u}\cos(t\theta) + \hat{v}\sin(t\theta) \tag{11}\label{NA11}$$
Note that the approach works for any $\vec{p}_2$ that is on the circular arc between $\vec{p}_1$ and $\vec{p}_3$; there is no need to require $\vec{p}_2 = \vec{P}(0.5)$. (Having $\vec{p}_2$ away from $\vec{p}_1$ and $\vec{p}_3$ means the triangle they form is as "wide" as possible, reducing the rounding error in $\hat{n}$, so it is a very good choice; but other than that, this algorithm only expcets $\vec{p}_2$ to be somewhere on the arc between $\vec{p}_1$ and $\vec{p}_2$, i.e. at $\vec{P}(\tau)$ with $0 < \tau < 1$.)
In pseudocode, the function could be written as
Globals: xc, yc, zc, xu, yu, zu, xv, yv, zv, theta
Function x(t) = xc + xu*cos(t*theta) + xv*sin(t*theta)
Function y(t) = yc + yu*cos(t*theta) + yv*sin(t*theta)
Function z(t) = zc + zu*cos(t*theta) + zv*sin(t*theta)
Function Setup(x1, y1, z1, x2, y2, z2, x3, y3, z3):
# Note: This assumes
# x1*x1 + y1*y1 + z1*z1 == R*R
# x2*x2 + y2*y2 + z2*z2 == R*R
# x3*x3 + y3*y3 + z3*z3 == R*R
# although the exact value of R is irrelevant.
# Find plane unit normal vector (xn, yn, zn):
Let x12 = x2 - x1
Let y12 = y2 - y1
Let z12 = z2 - z1
Let x13 = x3 - x1
Let y13 = y3 - y1
Let z13 = z3 - z1
Let xn = y12*z13 - z12*y13
Let yn = z12*x13 - x12*z13
Let zn = x12*y13 - y12*x13
Let n = sqrt(xn*xn + yn*yn + zn*zn)
If (n <= 0.0) Then
Fail: "The three points are not in general position."
End If
Let xn = xn / n
Let yn = yn / n
Let zn = zn / n
# Signed distance from plane to origin
Let d = xn*x1 + yn*y1 + zn*z1
# Center of circle
Let xc = d*xn
Let yc = d*yn
Let zc = d*zn
# 2D U axis unit vector
Let xu = x1 - xc
Let yu = y1 - yc
Let zu = z1 - zc
# 2D V axis unit vector
Let xv = yn*zu - zn*yu
Let yv = zn*xu - xn*zu
Let zv = xn*yu - yn*xu
# Choose V axis towards (x2,y2,z2)
Let v2 = (x2 - xc)*xv + (y2 - yc)*yv + (z2 - zc)*zv
If (v2 < 0.0) Then
Let xv = -xv
Let yv = -yv
Let zv = -zv
End If
# Note: If needed, you can calculate
# r = sqrt(xu*xu + yu*yu + zu*zu)
# = sqrt(xv*xv + yv*yv + zv*zv)
# = sqrt(R*R - d*d)
# All three match to within rounding error,
# iff the initial assumption of all three
# points being at the same distance from
# origin is true.
# Find theta, the positive plane angle towards (x3,y3,z3).
Let xt = x3 - xc
Let yt = y3 - yc
Let zt = z3 - zt
Let thetau = xt*xu + yt*yu + zt*zu
Let thetav = xt*xv + yt*yv + zt*zv
Let theta = atan2(thetav, thetau)
If (theta < 0.0) Then
# Add 360 degrees, or 2*Pi in radians, to make it positive
Let theta = theta + 6.2831853071795864769252867665590
End If
# Done.
End Function
After calling Setup()
, x(0) == x1
, y(0) == y1
, z(0) == z1
; x(0.5) == x2
, y(0.5) == y2
, z(0.5) == z2
; and x(1) == x3
, y(1) == y3
, z(1) == z3
. The argument is relative arc length, or equivalently angle, from the first point to the third point (via the second point).
(I've tested this with an awk snippet and some random points. Do note that the initial assumption of the three points being equidistant from origin is necessary for the results to make sense; the pseudocode function above does not verify this is true. Obviously, small errors (rounding or measurement error) is allowed, and only causes an error of similar magnitude in the result; the function is surprisingly stable, numerically.)
Another possible approach would be to simply consider $\vec{p}_1$, $\vec{p}_2$, and $\vec{p}_3$ to be points on a circle, and solve $\hat{n}$, $\vec{c}$, and $r$ a partir de ellos, ignorando el original de la esfera completamente. Si ese enfoque produce resultados más precisos que los que se muestra arriba, no sé, depende de la precisión relativa de los puntos; esencialmente, de cómo las mediciones se realizan, y el grado de precisión del 3D de origen para la medición de la esfera.