2016-05-12 88 views
-1

我正在尝试在距离点p最近的矢量的椭圆体切线水平线上找到点。假设矢量不与椭圆相交。 基本上是这样的:如何找到最接近点p(x,y,z)发出的矢量v(x,y,z)的椭球的切线?

img

假设在画面我知道点p和矢量v的位置。我还知道椭圆的半径分量:1 x方向和.99方向y方向。

+0

'p,v'(相机位置,方向)是什么?您在文本中使用它们,但它们不在图像中,因此需要进行澄清。什么是解决方案约束:目标精度,目标计算时间限制。也都意味着3D问题,所以你也知道'Z'轴的半径,椭球轴是否对齐? – Spektre

+0

您的椭圆体是一个革命性的椭球体(有时称为球体)吗?我问,因为如果这是你可能能够使用一些geodesists使用的和。 – dmuir

+0

只是为了澄清你真的想'切线'通过'p'还是只是最接近的点来查看矢量轴?因为第一个选项并不总是解决方案,所以第二个选项只需要用最小的角度搜索点来查看矢量'v',这也是简单的'dot()' – Spektre

回答

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) 

去它很容易让拉姆达(ATAN2(X,Y))和R的其他方式(hypot将(X,Y)),但解开披和h从r和z是有点棘手。 讨论了一些方法here

解决您的问题的一种方法是找到具有最小高度的相机线上的点。经纬度和高度相同的点就是你要找的点。使用使用派生的最小化循环可能是有利的。虽然很乏味,但要计算从地理信息到笛卡尔坐标转换的导数矩阵,然后将其转化为求笛卡尔坐标转换为地理坐标的导数矩阵。

需要注意的一点是,任何涉及地理坐标的计算都可能会炸毁球体的两极!

+0

感谢您的信息Dmuir! – nich

0
  1. 你可以尝试计算这个代数

    ,但将最有可能导致超越方程的系统,我们不能代数无论如何解决,除非可以应用到它们转换为一些聪明的数学技巧更易于管理的方程式。例如,这是非常类似的问题(二维):

    我前一段时间处理,正如你可以看到公式是有点问题。如果添加3D,它将变得更糟,更不用提椭球问题了。

    所以我强烈建议不要除非你有没有其他选择

  2. 走这条路我会用approximation search最佳点可能

    这很简单,你只需要计算的距离为您的真实解决方案迭代解决方案。第一一些假设:

    • p - 摄像机位置的三维
    • 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) 
    

    所以两座相邻的点可以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.0,所以如果我们使用abs的值,那么我们可以直接将它用作搜索指标。

    所以,现在只需尝试椭球表面上的所有点,并记住最好的解决方案(其中e是最小的)。这将是O(n^2),这将是疯狂的双精度,但使用近似搜索或任何其他近似技术,它会变成O(log^2(n))这是可以接受的。

    还有一个问题,因为这样你需要扔掉不想要的(就像在切寻找载体具有太大的角度)在这种情况下,只需设置e到最大值这个任务有一个以上的解决方案(1.0 )。

    您可以通过不搜索整个表面来进一步提高性能。如果偏心率不是很大,那么可以用代数方法计算球体的q,然后只需在椭球体上搜索具有相同球面角坐标的近点。

    另一项改进可以轴分离...你可以将它转换为2倍2D问题有解在O(log(n))

相关问题