2012-09-07 78 views
1

我想使用.Net Chart對象來交互式地定義一個樣條函數,我使用它來從一個值範圍映射到另一個範圍。換句話說,我有一個0-4095範圍(x軸),我想使用樣條將其轉換爲0-100範圍(y軸)。我已經成功地創建了一個通過一組點繪製樣條曲線的圖表。用戶可以交互地移動點以獲得所需的功能形狀。很棒。C# - 使用樣條圖來映射值

現在...一旦我有像用戶想要的樣條,我怎麼能(使用樣條函數),找到任何x值相應的y值?

我似乎無法找到一種方法來做到這一點。我知道圖表對象正在進行計算,因爲它正在繪製樣條曲線......也許他們不提供對此的訪問。

另一種方法是自己進行樣條計算......除非絕對必要,否則我不想去那裏。

謝謝。

布賴恩

回答

1

你需要找到「T」(張力參數)的值產生x的期望值。如果您使用0到1的範圍,則參數「t」的值將接近0.5。一旦你知道你可以計算y的相應值。求解一個三次方程,它將生成「t」的三個值,這將導致x的值相同。檢查下面的鏈接。

http://algorithmist.wordpress.com/2009/09/28/cardinal-splines-part-2/

Cardinal樣條指定基於從前面的點到隨後的點的向量在內部點的切線。每個切線平行於這個矢量,並且它的長度是它的幾倍。例如,點P1的切線方向與矢量P2-P0平行,或者我們可以簡單地寫出如T1 = s(P2 - P0)的東西,其中s是一個實數。

檢查以下代碼的這部分,其中xtarget是輸入值x。

代碼:

for (Double t = 0; t<=1; t += 0.01) 
    { 
     s = (1 - t)/2; 
P(t)x = s(-t3 + 2t2 – t)P1X + s(-t3 + t2)P2X + (2t3 – 3t2 + 1)P2X + s(t3 – 2t2 + t)P3X + (-2t3 + 3t2)P3X + s(t3 – t2)P4X 

P(t)y = s(-t3 + 2t2 – t)P1Y + s(-t3 + t2)P2Y + (2t3 – 3t2 + 1)P2Y + s(t3 – 2t2 + t)P3Y+ (-2t3 + 3t2)P3Y + s(t3 – t2)P4Y 

if(P(t)x=>xtarget) 
{ 
return P(t)y; 
} 
} 

上述方法將給出曲線上的近似點P(噸)Y。

+0

謝謝。這是我期望的方法......只是希望圖表類提供了一些內容來反饋所提供樣條的這些值。 –