我有一个点数据数组,点的值表示为x坐标和y坐标。
这些点可以在500到2000点或更多的范围内。
数据表示一个运动路径,范围从简单到非常复杂,也可以有尖点。
我可以将此数据表示为一个样条线或一组样条线或其他一些压缩非常紧密的格式。
我曾试图将它们作为贝塞尔的集合来代表,但最多我节省了40%。 例如,如果我有一个500点的数组,这给了我500 x和500 y的值,所以我有1000个数据。 我大约有100个二次贝塞尔曲线。每个bezier表示为controlx,controly,anchorx,anchory。 这给了我100 x 4 = 400 pcs的数据。 所以输入= 1000pcs,输出= 400pcs。
我想进一步加强这个,有什么建议吗?
答案 0 :(得分:2)
就其本质而言,样条是近似值。您可以减少用于达到更高压缩比的样条线数量。
您还可以使用某种编码方案实现无损压缩。我正在打字时使用前一个答案中的范围示例(1000表示x,400表示y),
要正确解码序列,您需要一些前缀来标识编码类型。假设我们使用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%。
答案 1 :(得分:1)
例如,如果您使用32位整数作为点坐标并且存在范围限制,例如x:0..1000,y:0..400,则可以将(x,y)打包成a单个32位变量。
这样你就可以实现另外50%的压缩。
答案 2 :(得分:1)
您可以对要编码的数字进行频率分析,并使用不同的位长来表示它们,当然这里我模糊地描述Huffman coding
答案 3 :(得分:1)
首先,只在您确实需要的数据中保留足够的小数点。删除这些会降低您的准确性,但会产生计算损失。要做到这一点,尝试将您的数字转换为字符串,定位点的位置,并从末尾剪切这些字符。这可能比数学,IMO更快。最后,您可以将其转换回数字。
150.234636746 -> "150.234636746" -> "150.23" -> 150.23
其次,尝试存储相对于最后一个数字的数据(“相对值”)。基本上从这一个中减去最后一个数字。然后稍后“解压缩”它可以保留累加器变量并将它们加起来。
A A A A R R
150, 200, 250 -> 150, 50, 50