我正在构建一个与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的值需要进行插值,因为它不属于用户定义的范围。这显然是一个非常简单的例子。有些PolyLines可能缺少更多值。
我做了什么:
我研究过线性插值。看一下示例youtube视频,很难将我的脑袋缠绕在它周围。
我需要什么:
任何语言的代码示例或线性/双线性/三线性插值背后理论的“英语”解释,以便我可以将其实现到我的程序中。我的数学技能不是最好的,所以我很难理解wikipedias对它的定义。
我还假设线性插值是我需要研究的,
编辑:目前实施以下内容,如果我错了就阻止我
我正在使用我认为是毕达哥拉斯理论类型的方法。我还没有让它捕获异常(即确保左边的点实际上已经离开,确保列表不会超出界限等),这可能会在以后出现
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作为上述示例表的答案。这听起来对我来说是正确的。我在互联网上用样本数据检查了我的距离计算器方法,似乎正在做这个伎俩。
答案 0 :(得分:0)
第一步,创建一个计算距离的例程:
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));
我在几组数据上检查了这一点,这是我能找到的最准确的东西......让我感到震惊的是,我无法在任何地方找到任何现有代码来执行此操作。