【发布时间】:2020-02-07 08:40:18
【问题描述】:
我有两条曲线。一个手绘,一个是手绘的平滑版本。 每条曲线的数据存储在 2 个单独的向量数组中。 时间增量也存储在手绘曲线矢量中,因此我可以重播绘制过程,使其看起来自然。
现在我需要将时间增量从曲线 1(原始输入)转移到曲线 2(已经平滑的曲线)。
第一个向量的大小有时比第二个向量大,有时比第二个向量小。
(取决于输入绘制速度)
所以我的问题是:如何用正确的值填充向量 PenSmoot.time?
案例一:输入向量较大
PenInput.time[0] = 0 PenSmoot.time[0] = 0
PenInput.time[1] = 5 PenSmoot.time[1] = ?
PenInput.time[2] = 12 PenSmoot.time[2] = ?
PenInput.time[3] = 2 PenSmoot.time[3] = ?
PenInput.time[4] = 50 PenSmoot.time[4] = ?
PenInput.time[5] = 100
PenInput.time[6] = 20
PenInput.time[7] = 3
PenInput.time[8] = 9
PenInput.time[9] = 33
案例 2:输入向量更小
PenInput.time[0] = 0 PenSmoot.time[0] = 0
PenInput.time[1] = 5 PenSmoot.time[1] = ?
PenInput.time[2] = 12 PenSmoot.time[2] = ?
PenInput.time[3] = 2 PenSmoot.time[3] = ?
PenInput.time[4] = 50 PenSmoot.time[4] = ?
PenSmoot.time[5] = ?
PenSmoot.time[6] = ?
PenSmoot.time[7] = ?
PenSmoot.time[8] = ?
PenSmoot.time[9] = ?
简化表示:
PenInput holds the whole data of a drawn curve (Raw Input)
PenInput.x // X coordinate)
PenInput.y // Y coordinate)
PenInput.pressure // The pressure of the pen)
PenInput.timetotl // Total elapsed time)
PenInput.timepart // Time fragments)
PenSmoot holds the data of the massaged (smoothed,evenly distributed) curve of PenInput
PenSmoot.x // X coordinate)
PenSmoot.y // Y coordinate)
PenSmoot.pressure // Unknown - The pressure of the pen)
PenSmoot.timetotl // Unknown - Total elapsed time)
PenSmoot.timepart // Unknown - Time fragments)
这是我拥有的结构。
struct Pencil
{
sf::VertexArray vertices;
std::vector<int> pressure;
std::vector<sf::Int32> timetotl;
std::vector<sf::Int32> timepart;
};
【问题讨论】:
-
代码示例会更有帮助。
-
到目前为止,您自己尝试做些什么来解决这个问题?
-
对于线性插值,您有两个点(通常是
x,y值),并且您在这两个点之间有一些第三点x,您想要为其查找y值。您的问题的要点是什么,您要插入的x值列表是什么,以找到y的值?见Linear interpolation -
如果您只是想均匀地分配时间值,这非常简单。转换时间以存储累积和,然后对于目标中的每个索引,计算(可能是小数)索引以对“嘈杂”时间进行采样。使用基本的线性插值来计算分数索引的时间。现在,您的平滑时间也是重新采样的累积总和。现在将其反转以将这些时间变回增量,您就完成了。
-
我说的是重新采样从一个样本计数到一个新样本计数的时间增量,假设您想尽可能地保留它们。微不足道的情况是噪声和平滑计数相同,所有其他情况通过累积和的线性插值来近似。在所有情况下,最终结果是噪声和平滑时间加起来应该是相同的总时间,并且具有大致相同的“形状”。