2017-04-04 71 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; 
}