2017-04-19 9 views
0

みましょう私はP0とP4は値が0.0と4.0で固定されている5点を、しまし言う:ポイントを伸ばす方法は?

0 | 1.0 | 2.0 | 3.0 | 4 

ポイント途中では変更することができますが、それらは移動後に他の人を伸ばす必要があります。 「右へ」stretchためだから、

、それは各ポイント間の比率を保ち、移動点の周りの前の値と移動点と最後の点の間press次のものをenlarge必要があります。

私が書きました、元の2.0 x位置から2.5に3度のポイントを移動し、このcode:私に与える

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?)

誰も助けてくれますか?あなたが非ゼロ起点について開始値が初期ために線形補間を適用するために、一般的に非ゼロ

であれば、同じ論理が、&過去のポイントに適用されるべきであることを

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

注忘れ

答えて

1

X0..X1間隔と最終X0new..X1neワット間隔、1はあなたがポイントの左側にやった

(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によって提案されていますか? p.s. 'points [prevPoint]への警告)' typo – markzzz

+1

実際、正しく、正しい線形変換です。また、0ではなく左側の点で開始するコードではなく、コメント付きのコードを取り、 '0 'を' points [0] 'で置き換えることができます –

関連する問題