近似球面上两条线段之间的相对角度

Approximating relative angle between two line segments on sphere surface

我需要一个主意!我想在 3D 中对眼睛上的血管网络进行建模。我已经对与血管直径、长度等相关的分支行为进行了统计。我现在所坚持的是可视化:

眼睛近似为一个球体 E,中心在原点 C = [0, 0, 0],半径 r

我要实现的是根据下面的输入参数,应该可以在E的surface/perimeter上画出一个线段:

输入:

输出:

我现在做的,是这样的:

  1. P_0 生成一个半径为 L 的球体,代表我们可能以正确长度绘制的所有点。这个集合叫做pool.
  2. 限制 pool 只包括距离 C 介于 r*0.95r 之间的点,因此只包括眼睛周围的点。
  3. Select 仅生成最接近所需角度的相对角度 (2) 的点 a.

问题是,我想要的任何角度a,实际上并不是点积所衡量的。假设我想要一个 0 的角度(即新线段遵循与前一个相同的方向,由于球体的曲率,我实际得到的是一个大约 30 度的角度。我想我想要的更多是 2D从球体到分支点的正交角度观察时的角度。请查看下面的屏幕截图以进行可视化。

有什么想法吗?


(1) 原因是,直径最大的子节点通常沿着前一段的路径,而较小的子节点往往角度不同。

(2) 由acos(dot(v1/norm(v1), v2/norm(v2)))

计算

解释问题的屏幕截图:

黄线:上一段 红线:"new" 分段到其中一个点(不一定是正确的点) 蓝色 x'es:池(文本=弧度角度)

我会用我自己的符号重述问题:

Given two points P and Q on the surface of a sphere centered at C with radius r, find a new point T such that the angle of the turn from PQ to QT is A and the length of QT is L.

因为分段相对于球体来说很小,我们将在轴心点 Q 处使用球体的局部平面近似。(如果这不是一个好的假设,您需要在你的问题。)

然后您可以按如下方式计算 T。

// First compute an aligned orthonormal basis {U,V,W}.
//  - {U,V} should be a basis for the plane tangent at Q.
//  - W should be normal to the plane tangent at Q.
//  - U should be in the direction PQ in the plane tangent at Q
W = normalize(Q - C)
U = normalize(Q - P)
U = normalize(U - W * dotprod(W, U))
V = normalize(crossprod(W, U))

// Next compute the next point S in the plane tangent at Q.
// In a regular plane, the parametric equation of a unit circle
// centered at the origin is:
//     f(A) = (cos A, sin A) = (1,0) cos A + (0,1) sin A
// We just do the same thing, but with the {U,V} basis instead
// of the standard basis {(1,0),(0,1)}.
S = Q + L * (U cos A + V sin A)

// Finally project S onto the sphere, obtaining the segment QT.
T = C + r * normalize(S - C)