2016-05-12 84 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))

相關問題