1

我有一个点数据数组,点的值表示为 x 坐标和 y 坐标。

这些点可以在 500 到 2000 点或更多的范围内。

数据表示运动路径,其范围可以从简单到非常复杂,也可以在其中包含尖点。

我可以将此数据表示为一个样条曲线或一组样条曲线或其他具有非常紧密压缩的格式。

我尝试将它们表示为贝塞尔曲线的集合,但充其量我可以节省 40%。例如,如果我有一个包含 500 个点的数组,这给了我 500 个 x 和 500 个 y 值,所以我有 1000 个数据片段。我从中得到了大约 100 个二次贝塞尔曲线。每个贝塞尔曲线表示为 controlx, controly, anchorx, anchory。这给了我 100 x 4 = 400 个数据。所以输入 = 1000 个,输出 = 400 个。

我想进一步加强这一点,有什么建议吗?

4

4 回答 4

2

就其本质而言,样条曲线是一种近似值。您可以减少用于达到更高压缩比的样条线数量。

您还可以通过使用某种编码方案来实现无损压缩。我只是在打字时编造这个,使用上一个答案中的范围示例(x 为 1000,y 为 400),

  1. 每个点只需要 19 位(x 为 10,y 为 9)。您可以使用 3 个字节来表示一个坐标。
  2. 使用 2 个字节来表示最大 +/- 63 的位移。
  3. 使用 1 个字节表示 x 为 +/- 7 的短位移,y 为 +/- 3。

要正确解码序列,您需要一些前缀来识别编码类型。假设我们使用 110 表示全点,10 表示位移,0 表示短位移。

位布局将如下所示,

Coordinates:        110xxxxxxxxxxxyyyyyyyyyy
Dislacement:        10xxxxxxxyyyyyyy
Short Displacement: 0xxxxyyy

除非您的序列是完全随机的,否则您可以使用此方案轻松实现高压缩比。

让我们用一个简短的例子来看看它是如何工作的。

3分:A(500, 400), B(550, 380), C(545, 381)

假设您为每个坐标使用 2 个字节。在不压缩的情况下编码需要 16 个字节。

要使用压缩方案对序列进行编码,

A 是第一个点,因此将使用完整坐标。3 个字节。B 到 A 的位移是 (50, -20) 并且可以编码为位移。2 个字节。C 到 B 的位移是 (-5, 1) 并且它适合短位移 1 字节的范围。

所以你节省了 16 个字节中的 10 个字节。实际压缩率完全取决于数据模式。它在形成移动路径的点上效果最好。如果点是随机的,只能节省25%。

于 2009-08-11T15:44:03.087 回答
1

例如,如果您使用 32 位整数作为点坐标并且存在范围限制,
例如 x: 0..1000, y:0..400,您可以将 (x, y) 打包成一个 32 位变量。

这样您就可以再实现 50% 的压缩。

于 2009-08-11T15:20:39.577 回答
1

您可以对您尝试编码的数字进行频率分析,并使用不同的位长来表示它们,当然我在这里模糊地描述了霍夫曼编码

于 2009-08-11T15:58:19.763 回答
1

首先,在您的数据中只保留您实际需要的足够的小数点。删除这些会降低您的准确性,但这是一个经过计算的损失。为此,请尝试将您的数字转换为字符串,定位点的位置,并从末尾删除这些字符。这可能比数学处理得更快,IMO。最后,您可以将其转换回数字。

 150.234636746  ->  "150.234636746"  ->  "150.23"  ->  150.23


其次,尝试相对于最后一个数字(“相对值”)存储您的数据。基本上从这个数字中减去最后一个数字。然后稍后要“解压缩”它,您可以保留一个累加器变量并将它们相加。

 A    A    A             A    R   R
 150, 200, 250     ->    150, 50, 50
于 2009-08-12T15:14:15.400 回答