2014-02-18 42 views
1

我正在構建一個與PolyLineZ(ESRI Shapefile)數據一起使用並重寫外部Z值的窗體應用程序。的最小和最大Z值由用戶通過接口定義當給定完整和不完整的XYZ對時插值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

這是否應該移動到http://math.stackexchange.com/? – jacknad

+0

如果您還沒有嘗試編碼,我不認爲這是適合尋找答案的地方。嘗試寫下來,然後回來。 –

+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)); 

我檢查這個多套的數據,這是我能找到的最準確的東西......我的想法是,我無法在任何地方找到任何現有的代碼來做到這一點。