2017-04-19 54 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' –