2017-04-04 70 views
-1

我目前正在研究一種軟件,它可以從現有測量數據中插入數據,並從中進行估算。數據安排在2D環境中,我們在一個軸上獲得風速,在另一個軸上獲得風角,每個點代表目標速度。來自2d空間的平均值

對於我有三點的例子:
P1:風速6節,風角度90度=>目標速度5個
P2:風速6節,風角度70度=>目標速度6
P3:風速8節,風角度70度=>目標速度7

現在我想要進行內插的風速6節和風向角80度的角度。我想要一個使用所有這些點的算法,並給我這三個點的平均值。上一頁我做了一個3D渲染器,我想我使用了一種技術來爲一個多邊形着色,我認爲在這種情況下這可能很有用。我在互聯網上找到的所有例子都依賴於OpenGL等,這對我來說不起作用,因爲我希望這個解決方案是嵌入式環境的純c/C++。由於我在嵌入式環境中運行,因此主要依據程序大小獲得有限的資源。

你們有沒有人有任何指示來幫助我解決這個問題?謝謝!

+1

歡迎stackoverflow.com。請花些時間閱讀[幫助頁面](http://stackoverflow.com/help),尤其是名爲[「我可以問些什麼話題?」]的章節(http://stackoverflow.com/help/)討論話題)和[「我應該避免問什麼類型的問題?」](http://stackoverflow.com/help/dont-ask)。請參閱[tour](http://stackoverflow.com/tour)並閱讀[如何提出良好問題](http://stackoverflow.com/help/how-to-ask)。最後,請學習如何創建[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。 – Weaboo

+0

我並不是要求一個完整的解決方案,只是一個指向用來着色多邊形的算法的指針。 – user2135792

+0

檢查答案,並讓我知道它是否有幫助。 – Weaboo

回答

0

數據是否在規則網格上?如果是這樣,我只會使用線性插值。如果沒有,那麼看看像qhull這樣的東西。

+0

是的,我會說這是一個規則的網格。在未來,我可能會考慮更復雜的插值,但現在使用3d平面進行線性插值。謝謝! – user2135792

0

在深入我的舊微積分後,我發現這個問題的數學答案。

既然我已經得到了在空間中的三個點,我可以形成一個平面:

P: (Px, Py, Pz) 
Q: (Qx, Qy, Qz) 
R: (Rx, Ry, Rz) 

這些點並在這裏http://tutorial.math.lamar.edu/Classes/CalcIII/EqnsOfPlanes.aspx描述的數學讓我向前走。

Vector(PQ) = (PQx, PQy, PQz) 
Vector(PR) = (PRx, PRy, PRz) 

現在我申請的交叉產品,這兩個向量,這給(這裏所描述的跨產品的數學:http://tutorial.math.lamar.edu/Classes/CalcII/CrossProduct.aspx#Vectors_CrossProd_Ex2
平面的法向量

Vector(PQ) x Vector(PR) = Vector(PQy * PRz - PQz * PRy, 
           PQz * PRx - PQx * PRz, 
           PQx * PRy - PQy * PRx) 

所以,這就是我得趕緊爲平面方程,不尊重,它必須通過槽的要點之一:

x(PQy * PRz - PQz * PRy) + y(PQz * PRx - PQx * PRz) + z(PQx * PRy - PQy * PRx) = 0 

要得到充分方程式我的飛機通過了所有的點,我必須應用一個點,如第一個鏈接中的示例1所述。

x(PQy * PRz - PQz * PRy) + y(PQz * PRx - PQx * PRz) + z(PQx * PRy - PQy * PRx) = 
Px(PQy * PRz - PQz * PRy) + Py(PQz * PRx - PQx * PRz) + Pz(PQx * PRy - PQy * PRx) 

要將我的例子,這個公式我得到下面的公式:

P: (90, 6, 5) 
Q: (70, 6, 6) 
R: (70, 8, 7) 

Vector(PQ) = (20, 0, -1) 
Vector(PR) = (20, -2, -2) 

這些跨產品給了我這個公式:

-2x + 20y - 40z = 0 

如果我現在申請點P到這我可以得到我的飛機的完整方程式:

-2x + 20y - 40z = -2 * 90 + 20 * 6 - 40 * 5 
-2x + 20y - 40z = -260 
z = (-2x + 20y + 260)/40 

當我尋找其中x = 6和y = 80的z值時,我將這些值放入等式中。

x = 80 
y = 6 
z = (-2 * 80 + 20 * 6 + 260)/40 
z = 5.5 

5.5是這個例子中,預期的答案,因爲它正好在P和Q

最終實現該算法的中間:

float TargetSpeed::PlaneInterpolation(Point3D p, Point3D q, Point3D r, int x, int y) 
{ 
    Point3D pq = Point3D(p.X - q.X, p.Y - q.Y, p.Z - q.Z); 
    Point3D pr = Point3D(p.X - r.X, p.Y - r.Y, p.Z - r.Z); 

    Point3D n = Point3D(pq.Y * pr.Z - pq.Z * pr.Y, 
         pq.Z * pr.X - pq.X * pr.Z, 
         pq.X * pr.Y - pq.Y * pr.X); 
    float d = n.X * p.X + n.Y * p.Y + n.Z * p.Z; 

    float z = (d - n.X * (float)x - n.Y * (float)y)/n.Z; 
    return z; 
}