近似球面上两条线段之间的相对角度
Approximating relative angle between two line segments on sphere surface
我需要一个主意!我想在 3D 中对眼睛上的血管网络进行建模。我已经对与血管直径、长度等相关的分支行为进行了统计。我现在所坚持的是可视化:
眼睛近似为一个球体 E
,中心在原点 C = [0, 0, 0]
,半径 r
。
我要实现的是根据下面的输入参数,应该可以在E
的surface/perimeter上画出一个线段:
输入:
- 前一段结束的笛卡尔位置:
P_0 = [x_0, y_0, z_0]
- 片段长度:
L
- 段直径:
d
- 相对于前一段的所需角度:
a
(1)
输出:
- 结果段结束的笛卡尔位置:
P_1 = [x_1, y_1, z_1]
我现在做的,是这样的:
- 从
P_0
生成一个半径为 L
的球体,代表我们可能以正确长度绘制的所有点。这个集合叫做pool
.
- 限制
pool
只包括距离 C
介于 r*0.95
和 r
之间的点,因此只包括眼睛周围的点。
- 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)
我需要一个主意!我想在 3D 中对眼睛上的血管网络进行建模。我已经对与血管直径、长度等相关的分支行为进行了统计。我现在所坚持的是可视化:
眼睛近似为一个球体 E
,中心在原点 C = [0, 0, 0]
,半径 r
。
我要实现的是根据下面的输入参数,应该可以在E
的surface/perimeter上画出一个线段:
输入:
- 前一段结束的笛卡尔位置:
P_0 = [x_0, y_0, z_0]
- 片段长度:
L
- 段直径:
d
- 相对于前一段的所需角度:
a
(1)
输出:
- 结果段结束的笛卡尔位置:
P_1 = [x_1, y_1, z_1]
我现在做的,是这样的:
- 从
P_0
生成一个半径为L
的球体,代表我们可能以正确长度绘制的所有点。这个集合叫做pool
. - 限制
pool
只包括距离C
介于r*0.95
和r
之间的点,因此只包括眼睛周围的点。 - 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)