【问题标题】:geolocalization algo transform bidimention to one地理定位算法将双向转换为一
【发布时间】:2014-01-25 14:49:06
【问题描述】:

我有一种无法表达的解决方案的感觉:

众所周知,地理点的 lat 和 lng 数字是有限的(假设限制为 50)。因此,如果我们考虑一个长度为3、高度为3 的正方形,我们可以用093x3)之间的唯一数字表示所有点的组合,对吧?

例如对于x=3y=2 的坐标,我们可以说3x2 = 6 表示两个点(3,2)和(2,3)。因此,如果我们添加一个维度来区分这两个点,我们可以用一个数字来表示二维空间。假设如果 y-x>0,我们添加 10,以便我们可以区分 (3,2) = 6(2,3) = 16(为了简单起见:我们可以添加 9 以在我们的数字基础中获得空间,但它已经足够复杂了,所以让我们先解决简单的问题)

现在,该解决方案可能很好,但我仍然有一个问题:如果点彼此靠近,我希望一维数字彼此靠近。添加10 if y > x 的解决方案在45° 点之前工作正常,但之后它会爆炸成非常远的数字,即使两个点彼此相邻(只是每个点都在中位数的一侧)。

那么你怎么能想象一个使用相同范围 (9x2) 但彼此靠近的点也具有小的一维距离的解决方案?

考虑过使用奇数和偶数,比如说第三个数字前:2.54812.5480 来区分与 y<x 标准的点,但我仍然不相信。欢迎评论

PS:请记住,我限制了可能性的范围,例如您会说:“是的,但是 6 可以表达 2x3, 3x2 and 2.7x2.222”,所以要回答这个问题,我们只需要修复位数。如果我们想要0 后面的一位数,我们将所有数乘以10,我们就完成了。

很容易想象我们可以为国际象棋游戏的每个单元格指定一个唯一的数字:然后我们将二维图像转换为一维表示。问题是使二维距离反映在一维数中

【问题讨论】:

  • 所以你基本上是想找到二维笛卡尔空间和一维笛卡尔空间之间的连续映射?
  • 可以尝试使用康托配对功能en.wikipedia.org/wiki/…
  • 嗨 Yevgeniy,非常感谢您的链接,我很高兴一些数学家已经针对这个问题。我的问题有点复杂,因为我想通过单个值预测距离:我的意思是我想要一维大数字的世界地图,但我也想预测哪些点的距离小于 D到任何点 N(如果可以更容易的话,对于一些预定义的 D):我什至可以拥有一个唯一的 D 并复制每个距离的数据。但我必须能够找到 N-D
  • 查看您的解决方案,我们可以从结果中找到原始值真是太好了。它还表明,由于我们在函数中有一个额外的 k2,因此对 y 轴上的距离比 x 轴上的距离更敏感。让我们用不同的方式来表述这个问题:到根点的距离可以表示为 sqrt( (x-0)²+(y-0)² ) 对点 (x,y) 应用康托尔函数,所有的它周围的圆点(射线 D)。也许我可以将其表达为 z-d'
  • 我的意思是 z-d'

标签: algorithm math geometry


【解决方案1】:

空间填充曲线可以将维度例如从 2d 减少到 1d,有时会有所帮助。它也被命名为怪物曲线,因为曲线完全填满了平面。您可以使用递归和 L 系统来计算它。还有非递归的方法。你可以下载我的 php 类 hilbert-curve@phpclasses.org。它使用基于表格的方法。您还可以在《黑客喜悦》一书和 Nick 的空间索引四叉树博客中找到详细信息。

【讨论】:

    【解决方案2】:

    听起来您正在寻找空间填充曲线,例如希尔伯特曲线。网格上彼此靠近的点往往在其沿希尔伯特曲线的位置上彼此靠近。当然,这只是“平均”;任何空间填充曲线都会有某些点对,它们在空间中靠近但在曲线上很远。

    【讨论】:

    • 但是你觉得我应该怎么写呢?我的意思是我必须为每个地理点请求计算一条曲线吗?问题是我有一个点,我需要找到靠近它的点。所以如果我的地图上满是点,我不需要所有的点,只需要靠近我要求的点。这可能会导致每个请求都计算一条曲线,不是吗? (对不起,我有点迷路了 :-)
    • 我将您的答案标记为正确的答案,因为希尔伯特曲线接缝解决了我的问题。我将不得不阅读它(现在,我以不同的方式解决了我的问题:通过将点放在树结构中(这解决了我的问题,因为我正在处理地理点和管理限制可以解决问题)。无论如何我会阅读希尔伯曲线,听起来不错 ps:抱歉之前的评论,我的问题太深了,无法抽象地理解事物:)
    【解决方案3】:

    使用符号而不是 +10 标准怎么样?假设当 x > y 时 z > 0,当 x

    【讨论】:

      【解决方案4】:

      考虑使用奇数和偶数

      你实际上很接近。虽然其他人建议使用 希尔伯特曲线,但请搜索 Morton 或 Z-order,这是另一条空间填充曲线。然而,2D 到 1D 坐标(一旦量化)的正向和反向转换非常简单,只需对点/曲线坐标的位进行交错和去交错:

      def unpack_bits(val):
          val = ((val << 8) | val) & 0x00FF00FF
          val = ((val << 4) | val) & 0x0F0F0F0F
          val = ((val << 2) | val) & 0x33333333
          val = ((val << 1) | val) & 0x55555555
          return val
      
      def pack_bits(val):
          val &= 0x55555555
          val = ((val >> 1) | val) & 0x33333333
          val = ((val >> 2) | val) & 0x0F0F0F0F
          val = ((val >> 4) | val) & 0x00FF00FF
          val = ((val >> 8) | val) & 0x0000FFFF
          return val
      
      def map(x, y):
          return unpack_bits(x) | (unpack_bits(y) << 1)
      
      def unmap(s):
          return (pack_bits(s), pack_bits(s >> 1))
      

      【讨论】:

      • 希尔伯特曲线一点也不简单。这不是微不足道的转变。
      • @Phpdna 首先,我指的是 Z 阶空间填充曲线,而不是 Hilbert 曲线。其次,Z阶曲线的实际正反向转换可以用“(de)interleave the bits of the coordinates”几句话来描述,只需要10多行代码就可以实现,所以从这个意义上说是简单。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多