【问题标题】:Average value from 2d space二维空间的平均值
【发布时间】:2017-04-04 11:07:55
【问题描述】:

我目前正在开发一款软件,该软件可以从现有测量中插入数据并据此进行估算。数据排列在 2D 环境中,其中一个轴为风速,另一个轴为风角,每个点代表一个目标速度。

举个例子,我有三点:
p1:风速 6 节,风角 90 度 => 目标速度 5
p2:风速 6 节,风角 70 度 => 目标速度 6
p3:风速8节,风角70度=>目标速度7

现在我想插入风速 6 节和风角 80 度的点。我想要一个使用所有这些点的算法,并给出这三个点的平均值。

很久以前我制作了一个 3D 渲染器,我想我在那里使用了一种技术来为多边形着色,我认为这在这种情况下很有用。我在互联网上找到的所有示例都依赖于 OpenGL 等,这对我不起作用,因为我希望这个解决方案是用于嵌入式环境的纯 c/c++。由于我在嵌入式环境中运行,因此我的资源有限,主要是在程序大小方面。

你们中的任何人有什么建议可以帮助我解决这个问题吗?谢谢!

【问题讨论】:

标签: c++ arduino 2d polygon


【解决方案1】:

在深入研究我的旧微积分后,我找到了这个问题的数学答案。

鉴于我在空间中有三个点,我可以组成一个平面:

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;
}

【讨论】:

    【解决方案2】:

    数据是否在规则网格上?如果是这样,我只会使用线性插值之类的东西。如果没有,那么看看像 qhull 这样的东西。

    【讨论】:

    • 是的,我会说这是一个常规网格。将来我可能会研究更复杂的插值,但现在使用 3d 平面的线性插值。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多