我正在尝试找到最接近从点p发出的向量的椭球的切线平面上的点。假设矢量不与椭圆相交。 基本上是这样的:
在该图片中假设我知道点p
和向量v
的位置。我也知道椭圆的半径分量:x方向为1
,.99
方向为y
。
答案 0 :(得分:0)
您可以尝试以代数方式计算
但这很可能导致超越方程组,我们无论如何都无法用代数方法求解,除非可以应用一些聪明的数学技巧将它们转换为更易于管理的方程式。例如,这是非常类似的问题(在2D中):
我刚刚交易过,你可以看到方程式有点问题。如果你添加3D,它将变得更糟,更不用提椭圆体问题了。
所以我强烈建议不要这样做,除非你别无选择
我会尽可能使用approximation search
这很容易,你只需要计算迭代解决方案与真实解决方案的距离。首先是一些假设:
p
- 相机位置3D v
- 相机外观矢量3D r
- 轴对齐椭球半径3D c
- 轴对齐椭球中心3D q
- 切线经过p
的点(您想要的点)q-p
- 切线方向首先,我们需要知道椭球表面上任何点n(q)
的法线方向q
。在球体上它很容易,因为它只是q-c
但是对于椭圆体来说它有点棘手。我懒得算数,所以我会使用2个关闭点q
而不是躺在同一条线上并使用交叉产品。正如您将使用球面坐标一样,这很容易:
q(a,b).x=c.x+r.x*cos(a)*cos(b)
q(a,b).y=c.y+r.y*sin(a)*cos(b)
q(a,b).z=c.z+r.z*sin(b)
所以2个相邻点可以是q0=q(a+d,b),q1=q(a,b+d)
,其中d
是一个小角度步长。现在使用交叉产品很容易正常
n(q)=cross(q0-q,q1-q) // perpendicular vectr
n(q)/=|n(q)| // unit vector
所以最终到解决方案度量e
的距离可以像这样计算:
e=|(dot(n(q),(q-p)/|q-p|)|
如果(q-p)/|q-p|
和n(q)
彼此垂直,那么点积为0.0
离它越远,结果越接近+1.0
或{{1}所以如果我们使用它的-1.0
值,那么我们可以直接将其用作搜索指标。
所以现在只需尝试椭球表面上的所有点并记住最佳解决方案(其中abs
最小)。那将是e
,这对双精度来说是疯狂的,但是使用近似搜索或任何其他近似技术,它将变为O(n^2)
,这是可以接受的。
还有一个问题,因为这个任务有多个解决方案,所以你需要丢掉不需要的解决方案(比如看起来向量的切线角度太大)在这种情况下只需将O(log^2(n))
设置为最大值价值(e
)。
您可以通过不搜索整个表面来进一步提高性能。如果偏心率不是太大,那么你可以用代数方式计算球体的1.0
,然后在椭圆体上用相同的球面角坐标搜索近点。
另一项改进可以是轴分离......您可以将其转换为q
中可解决的2x 2D问题
答案 1 :(得分:0)
大地测量中使用的两个坐标系是(ECEF)笛卡儿和地理坐标。 ECEF代表以地球为中心的固定地球。给定球体外的点q,它的地理坐标是球体上的点p的纬度和经度,使得q在p的球面法线上,而高度坐标则是沿着球体的距离从p到q的法线。
从地理位置到笛卡儿的转换很简单,但走另一条路需要某种迭代过程。
对于地理到笛卡尔的我们有
x = r * cos( lambda)
y = r * sin( lambda)
z = ((1 - e2)*nu + h)*sin( phi)
where
r = (nu + h)*cos(phi)
nu = a / sqrt(1 - e2*sin(phi)*sin(phi))
phi the (geodetic) latitude, lambda the longitude, h the height
(these names are pretty conventional in geodesy)
另一方面,它很容易得到lambda(atan2(x,y))和r(hypot(x,y))但是从r和z中解开phi和h有点棘手。 讨论了一些方法here
解决问题的一种方法是在相机线上找到高度最小的点。具有相同纬度和经度以及0高度的点将是您寻找的点。使用使用衍生物的最小化路由可能是有利的。它很简单 - 虽然单调乏味 - 计算从一个点上的地理信息到笛卡儿的转换的导数矩阵,然后将其反转以得到从笛卡儿到地理信息的转换的导数矩阵。
需要注意的是,任何涉及地理坐标的计算都可能在球体的两极爆炸!