我有一种无法表达的解决方案的感觉:
众所周知,地理位置在纬度和数字中受限(假设限制为50)。因此,如果我们考虑长度为3
且高度为3
的正方形,我们可以在0
和9
之间的唯一数字中表示所有点的组合({{ 1}})对吗?
例如,对于3x3
,x=3
的坐标,我们可以说y=2
表示两个点(3x2 = 6
)和(3,2
)。因此,如果我们添加一个维度来区分这两个点,我们可以用一个数字表示二维空间。假设如果y-x> 0,我们加10,这样我们可以区分2,3
和(3,2) = 6
(只是为了保持简单:我们可以添加(2,3) = 16
来获得数字基数的空间,但它足够复杂,所以让我们简单地解决问题)
现在,这个解决方案可能会很好,但我仍然有一个问题:如果点数彼此接近,我希望1-D数字彼此接近。添加9
的解决方案可以正常工作直到10 if y > x
点,但之后它会爆炸到很远的数字,即使两个点彼此相邻(只是每个点位于中位数的一侧) )。
那你怎么能想象一个使用相同范围(45°
)的解决方案,但是彼此接近的点也有一个小的1-D距离呢?
考虑使用奇数和偶数后让我们说第3位数:9x2
和2.5481
来区分点与2.5480
标准,但我仍然不相信。欢迎提出意见
y<x
可以表达6
”所以要回答这个问题,我们只能解决这个问题。数字。如果我们想要2x3, 3x2 and 2.7x2.222
之后的一个数字,我们将所有数字乘以0
,我们就完成了。
很容易想象我们可以为国际象棋游戏的每个单元格提供一个唯一的数字:然后我们将二维图像转换为一维表示。问题是使二维距离反映在一维数字
中答案 0 :(得分:1)
空间填充曲线将尺寸从2d缩小到1d,有时会有所帮助。它也命名为怪物曲线,因为曲线完全填满了飞机。您可以使用递归和L系统来计算它。还有非递归方法。你可以下载我的php类hilbert-curve @ phpclasses.org。它使用基于表的方法。你也可以在黑客喜悦书和尼克的空间索引四叉树博客中找到详细信息。
答案 1 :(得分:0)
听起来你正在寻找一个空间填充曲线,比如希尔伯特曲线。在网格上彼此相邻的点在沿希尔伯特曲线的位置上彼此相邻。当然,这只是“平均”;任何空间填充曲线都会有一些在空间附近但在曲线上很远的点。
答案 2 :(得分:-1)
考虑使用奇数和偶数
你真的很亲密。虽然其他人建议使用希尔伯特曲线,但要搜索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))
答案 3 :(得分:-1)
使用符号代替+10标准怎么样?让我们说z>当x> 0时为0 y和z&lt;当x <0时年。要评估两点之间的距离,只需比较它们的绝对值;)