【问题标题】:Polygon compression for Integer coordinates整数坐标的多边形压缩
【发布时间】:2012-10-31 07:12:38
【问题描述】:

我在栅格中有多边形,带有“signed int”二维坐标。多边形的顶点按顺时针方向排列。

我想以某种更“空间友好”的方式存储这个多边形,即只存储 int x、y 坐标的序列。如果我用 rar 压缩这个文件,我得到的大小比未压缩的要小 3.5 倍。 有比简单地将 x,y 存储在一个序列中更好的表示吗?

压缩应该是无损的。

【问题讨论】:

  • 多边形是凸的吗?或者它也可以是非凸的?
  • @kutschkem 它不一定是凸的,但它是一个简单的多边形:它不会自相交。

标签: java compression polygon


【解决方案1】:

如果你的多边形是(x1, y1), (x2, y2) ... (xn, yn),你可以写成,

x1, x2-x1, x3-x2, xn-xn-1, y1, y2-y1 ..., yn-yn-1

通常,相邻 x,y 值之间的差异会小于绝对值,因此您可以将增量存储为 variable length ints。通过这样做,每个 x,y 对通常可以存储在 2 或 4 个字节而不是 8 个字节中。

【讨论】:

  • 两年前我已经这样实现了,但是没有使用var ints,我尽可能使用short,否则使用int。还有一个更好的解决方案,其中变量 int 不仅限于像 Google protobuf 中的整个字节(感谢您的链接):我读了一篇文章,他们可以使用 12 位、13 位等的 int 来完美地适应所需的大小的多边形 deltaX,y。这种类型的压缩的 java 源会很有趣
  • 哪个白痴否决了这个非常好的答案?到目前为止,它是唯一正确的。
  • 您在散文中看到的优势 x1,dx2,dx3,..dxn, y1,dy2,dy2,dyn 反对订购:x1,y1,dx2,dy2,dx3,dy3, ..,dxn,dyn
  • 它们可能是等价的
  • 对于特殊应用,如果只需要 x 坐标,例如通过 x-plane-sweep 搜索,您提出的订单可能会有一点优势。这需要一半的内存传递给这样的方法。
【解决方案2】:

很难提供明确的答案,因为结果取决于很多因素。我使用 GZIPOutputStream 进行了快速测试以压缩单个多边形,结果很大程度上取决于多边形的点数,也取决于它的面积。

基本上,我创建了具有越来越多顶点的多边形,这些顶点随机分布在预定义的区域中。然后我将顶点顺时针排序并用 GZIP 压缩差异

对于适合标准屏幕 (1440x900) 的多边形:

D Npoints: 3 Uncompressed: 24 Compressed: 41 Ratio: 0.58536583
D Npoints: 4 Uncompressed: 32 Compressed: 49 Ratio: 0.6530612
D Npoints: 5 Uncompressed: 40 Compressed: 58 Ratio: 0.6896552
D Npoints: 6 Uncompressed: 48 Compressed: 61 Ratio: 0.78688526
D Npoints: 7 Uncompressed: 56 Compressed: 66 Ratio: 0.8484849
D Npoints: 8 Uncompressed: 64 Compressed: 72 Ratio: 0.8888889
D Npoints: 9 Uncompressed: 72 Compressed: 80 Ratio: 0.9
D Npoints: 10 Uncompressed: 80 Compressed: 84 Ratio: 0.95238096
D Npoints: 11 Uncompressed: 88 Compressed: 89 Ratio: 0.98876405
D Npoints: 12 Uncompressed: 96 Compressed: 94 Ratio: 1.0212766
D Npoints: 13 Uncompressed: 104 Compressed: 96 Ratio: 1.0833334
D Npoints: 14 Uncompressed: 112 Compressed: 102 Ratio: 1.0980393
D Npoints: 15 Uncompressed: 120 Compressed: 108 Ratio: 1.1111112
. . .
D Npoints: 99 Uncompressed: 792 Compressed: 457 Ratio: 1.7330415

对于较大的区域 (1440*4x900*4),压缩率会降低:

D Npoints: 3 Uncompressed: 24 Compressed: 45 Ratio: 0.53333336
D Npoints: 4 Uncompressed: 32 Compressed: 55 Ratio: 0.58181816
D Npoints: 5 Uncompressed: 40 Compressed: 60 Ratio: 0.6666667
D Npoints: 6 Uncompressed: 48 Compressed: 67 Ratio: 0.7164179
D Npoints: 7 Uncompressed: 56 Compressed: 70 Ratio: 0.8
D Npoints: 8 Uncompressed: 64 Compressed: 79 Ratio: 0.8101266
D Npoints: 9 Uncompressed: 72 Compressed: 87 Ratio: 0.82758623
D Npoints: 10 Uncompressed: 80 Compressed: 93 Ratio: 0.86021507
D Npoints: 11 Uncompressed: 88 Compressed: 102 Ratio: 0.8627451
D Npoints: 12 Uncompressed: 96 Compressed: 109 Ratio: 0.88073397
D Npoints: 13 Uncompressed: 104 Compressed: 113 Ratio: 0.920354
D Npoints: 14 Uncompressed: 112 Compressed: 119 Ratio: 0.9411765
D Npoints: 15 Uncompressed: 120 Compressed: 125 Ratio: 0.96
D Npoints: 16 Uncompressed: 128 Compressed: 135 Ratio: 0.94814813
D Npoints: 17 Uncompressed: 136 Compressed: 137 Ratio: 0.99270076
D Npoints: 18 Uncompressed: 144 Compressed: 137 Ratio: 1.0510949
D Npoints: 19 Uncompressed: 152 Compressed: 148 Ratio: 1.027027
D Npoints: 20 Uncompressed: 160 Compressed: 148 Ratio: 1.081081
D Npoints: 21 Uncompressed: 168 Compressed: 154 Ratio: 1.0909091
D Npoints: 22 Uncompressed: 176 Compressed: 160 Ratio: 1.1
    . . . 
D Npoints: 99 Uncompressed: 792 Compressed: 520 Ratio: 1.5230769

我不确定如何获得小 3.5 的尺寸,但我假设您将一堆多边形压缩在一起。将多个多边形压缩在一起显然会增加压缩比。

当然,这对于程序来说不是一种可用的方法,因为它必须不断解压缩多边形才能将它们绘制到屏幕上,这需要更多内存,而 CPU 会超出整个目的。我只是想得到一些数字...

【讨论】:

  • 有些系统会像导航系统一样压缩路线图(多边形)的一部分,但不使用这部分。
  • @AlexWien 没有考虑过这种情况。在这种情况下这是有道理的,因为您没有重复绘制多边形。我不知道为什么,但我认为最初的意图是为屏幕上的多边形占用少量内存......
猜你喜欢
  • 2018-09-08
  • 1970-01-01
  • 2012-07-05
  • 1970-01-01
  • 2015-06-14
  • 2017-11-04
  • 1970-01-01
  • 1970-01-01
  • 2021-09-24
相关资源
最近更新 更多