如何拉伸点?
How to stretch points?
本文关键字:何拉伸 更新时间:2023-10-16
假设我有 5 个点,其中 p0 和 p4 固定值为 0.0 和 4.0:
0 | 1.0 | 2.0 | 3.0 | 4
中间的点可以改变,但一旦移动,它们必须拉伸其他点。
因此,对于"向右"stretch
,它必须在移动点周围enlarge
prev 值,并在移动点和最后一个点之间press
下一个值,保持每个点之间的比例。
我编写了这段代码,将 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)
请注意,如果起始值不为零,则应将相同的逻辑应用于前一个点
通常,要对初始X0..X1
区间和最终X0new..X1ne
w区间应用线性插值,必须使用
(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]);
}
相关文章:
- 如何在音频处理中使用超能力时间拉伸类
- 如何使用堆栈将字符串输入拉伸 k 次
- QTableView 拉伸标头,但保持交互性
- 如何将位图拉伸到父面板(wxWidgets 自定义)
- 从拉伸多边形构建多面体
- 如何防止 DirectX C++程序的拉伸/缩放
- 如何防止opengl绘图拉伸到窗口大小?
- 如何在Qt TableView中将列的宽度调整为数据并将最后一部分拉伸在一起
- ID3DXFont :文本被拉伸,如何获取字体的宽度和高度?
- 只有一列适合其内容大小,而另一列则拉伸
- 如何拉伸点?
- 在SDL2中拉伸图像
- glTranslatef拉伸我的球体,我怎么能不拉伸它就平移球体
- RGB颜色图像直方图使用OpenCV C 进行对比度拉伸
- C++在工具栏中心拉伸QLineEdit
- 什么时候应该调整Direct3D 11后缓冲区的大小,以防止在调整大小时拉伸
- 如何在 Q工具栏中添加可拉伸垫片
- 通过openCV对比拉伸图像
- Windows在从DirectX BackBuffer拉伸到WIndow时使用点采样
- C++拉伸均衡的图像