【问题标题】:Interpolating Z values when given complete and incomplete XYZ pairs给定完整和不完整 XYZ 对时对 Z 值进行插值
【发布时间】:2014-02-18 19:18:20
【问题描述】:

我正在构建一个 Windows 窗体应用程序,该应用程序使用 PolyLineZ (ESRI Shapefile) 数据并重写外围 Z 值。最小和最大 Z 值由用户通过界面定义

我们以下面为例,假设最小值为0,最大值为10:

XY      Z
1,1     0
1,3     1
1,5     7
1,7     11*
1,10    10

需要对带有 11 的值进行插值,因为它不属于用户定义的范围。这显然是一个非常简化的例子。一些折线可能会丢失更多值。

我做了什么:

我研究过线性插值。看了一些示例 youtube 视频,我很难理解它。

我需要什么:

来自任何语言的代码示例或线性/双线性/三线性插值背后理论的“英语”解释,以便我可以将其实现到我的程序中。我的数学技能不是最好的,所以我很难理解维基百科对它的定义。

我还假设我需要研究线性插值,

编辑:目前正在实施以下内容,如果我错了,请阻止我

我正在使用我认为是毕达哥拉斯理论类型的方法。我还没有让它捕获异常(即,确保左边的点实际上是离开的,确保列表没有超出范围等),这可能会在以后出现

internal static double calculateDistance(XYPoints a, XYPoints b)
{
    double xd = b.X - a.X;
    double yd = b.Y - a.Y;
    return Math.Sqrt(xd * xd + yd * yd);
}


for (var i = 0; i < polylinez.ZPoints.Count;i++)
{
    if (polylinez.ZPoints[i] > maxValue || (polylinez.ZPoints[i] < minValue))
    {
        //polylinez.ZPoints[i] = (((1 - polylinez.XYpoints[i].X) * polylinez.ZPoints[i - 1]) + (polylinez.XYpoints[i].X * polylinez.ZPoints[i + 1]));
        double prevdistance = calculateDistance(polylinez.XYpoints[i - 1], polylinez.XYpoints[i]);
        double nextdistance = calculateDistance(polylinez.XYpoints[i], polylinez.XYpoints[i + 1]);
        double fraction = prevdistance / nextdistance;
        double diffsBetweensZ = polylinez.ZPoints[i + 1] - polylinez.ZPoints[i - 1];
        Console.WriteLine(polylinez.ZPoints[i - 1] + (diffsBetweensZ * fraction));
    }
}

return polylinez;

它返回 9.12 作为上述示例表的答案。这听起来对我来说是正确的。我用互联网上的样本数据检查了我的距离计算器方法,它似乎可以解决问题。

【问题讨论】:

  • 这个应该转移到math.stackexchange.com吗?
  • 如果您还没有尝试编写代码,我认为这里不适合寻求答案。试着写出来然后回来。
  • 我开发了整个 Windows 窗体应用程序(加载文件、类所有设置等)!我只是坚持实现线性插值背后的逻辑。我不是要求有人为我写,只是朝着正确的方向前进。
  • Z = 1( - X) z0 + (x)(z1) 怎么给你 10?
  • 原来的公式是图片格式,我复制错了。现在已经修好了。

标签: c# winforms gis linear-programming linear-interpolation


【解决方案1】:

第一步,创建一个计算距离的例程:

internal static double calculateDistance(XYPoints a, XYPoints b)
{
    double xd = b.X - a.X;
    double yd = b.Y - a.Y;
    return Math.Sqrt(xd * xd + yd * yd);
} 

我将变量名称更改为更合乎逻辑的名称(我的变量名称不同)

//get distance frpm previous point to point in question
double prevdistance = calculateDistance(prevXYpoint, currentXYPoint);
//get distance frpm point in question to the next point
double nextdistance = calculateDistance(currentXYPoint, nextXYPoint);
//generate a ratio
double fraction = prevdistance / (nextdistance + prevdistance);
//find out the difference between the two known points
double diffsBetweensZ = nextZpointValue - prevZpointValue;
//interpolate!
double newZvalue = (prevZpointValue + (diffsBetweensZ * fraction));

我检查了几组数据,这是我能找到的最准确的结果......让我大吃一惊的是,我无法在任何地方找到任何现有代码来执行此操作。

【讨论】:

    猜你喜欢
    • 2019-07-29
    • 1970-01-01
    • 2018-12-23
    • 2015-12-10
    • 2021-05-14
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    相关资源
    最近更新 更多