2017-04-19 83 views
0

讓說我5點,其中P0和P4是固定值0.0和4.0:如何拉伸點?

0 | 1.0 | 2.0 | 3.0 | 4 

中間的點可以改變,但必須一次拉伸等運動。

所以對於一個stretch「向右」,它必須enlarge圍繞移動點press移動點和最後點之間的下一者的上一個值,並且保持每個點之間的比例。

我已經寫這code其中3°點從原來的2.0 x位置移動到2.5

const int numPoints = 5; 
double points[numPoints] = { 0.0, 1.0, 2.0, 3.0, 4.0 }; 

int stretchedPoint = 2; 
double prevX = points[stretchedPoint]; 
points[stretchedPoint] = 2.5; 

std::cout<< points[0]; 
for (int prevPoint = 1; prevPoint < numPoints - 1; prevPoint++) { 
    // prev points 
    if (prevPoint < stretchedPoint) { 
     double ratio = points[stretchedPoint]/prevX; 
     points[prevPoint] *= ratio; 
    // next points 
    } else if (prevPoint > stretchedPoint) { 
     double ratio = (points[numPoints - 1] - prevX)/(points[numPoints - 1] - points[stretchedPoint]); 
     points[prevPoint] *= ratio; 
    } 

    std::cout << " | " << points[prevPoint]; 
} 
std::cout << " | " << points[numPoints - 1]; 

它給我正確的結果爲上一個點:

0 | 1.25 | 2.5 | 0.76 | 4 

但是當我嘗試爲下一個點應用「相同包裹的數學」時,我得到了一個不成比例的縮放,這給出了奇怪的結果(4?)

任何人都可以幫助我嗎?

回答

1

您忘非零起點

points[prevPoint] = points[stretchedPoint] + ratio * (points[prevPoint] - prevX) 

注意,相同的邏輯應適用於previos分,如果開始值是非零

一般來說,應用線性內插用於初始X0..X1區間和最終X0new..X1ne瓦特間隔,一個必須使用

(Xnew - X0new)/(X1new - X0new) = (X - X0)/(X1 - X0) 
so 
XNew = X0new + (X1new - X0new) * (X - X0)/(X1 - X0) 
+0

嗯,你使用的比例是多少?現在0.96現在http://coliru.stacked-crooked.com/a/f5671e6fbfba8419 – markzzz

+0

我的錯,我用過去的價值觀爲伸展點。無論如何編輯 – MBo

+0

3,25是錯的!比例不被保留。 – markzzz

1

你那點左側什麼(這是工作)可以這樣莫名其妙地改寫:

// double ratio = (points[stretchedPoint] - 0)/(prevX - 0); 
// points[prevPoint] = 0 + ratio * (points[prevPoint] - 0); 

爲了實現在右側完全雙,它應該是:

} else if (prevPoint > stretchedPoint) { 
    double ratio = (points[numPoints - 1] - points[stretchedPoint])/
     (points[numPoints - 1] - prevX); 
    points[prevPoint] = points[numPoints - 1] - 
     ratio * (points[numPoints-1] - points[prevPoint]); 
} 
+0

你的算法似乎很完美。 @MBo建議使用「線性插值」公式嗎?附:警告'點[prevPoint])'錯字 – markzzz

+1

事實上,是的,這是正確的線性轉換。也不是從左側的任何點開始而是從零開始,可以採用註釋的代碼並用'points [0]替換'0' –