如何拉伸点?
让说我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
?)
任何人都可以帮助我吗?
您忘非零起点
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)
你那点左侧什么(这是工作)可以这样莫名其妙地改写:
// 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]);
}
你的算法似乎很完美。 @MBo建议使用“线性插值”公式吗?附:警告'点[prevPoint])'错字 – markzzz
事实上,是的,这是正确的线性转换。也不是从左侧的任何点开始而是从零开始,可以采用注释的代码并用'points [0]替换'0' –
嗯,你使用的比例是多少?现在0.96现在http://coliru.stacked-crooked.com/a/f5671e6fbfba8419 – markzzz
我的错,我用过去的价值观为伸展点。无论如何编辑 – MBo
3,25是错的!比例不被保留。 – markzzz