【问题标题】:Mapping unique points to unique integer index将唯一点映射到唯一整数索引
【发布时间】:2013-06-03 21:40:43
【问题描述】:

我根本不熟悉坐标系或处理这些事情的大部分数学。我想要做的是取一个点(x,y),并在一维数组中找到它的位置,使其遵循:

(0,2)->0 (1,2)->1 (2,2)->2
(0,1)->4 (1,1)->5 (2,1)->6
(0,0)->8 (1,0)->9 (2,0)->10

箭头表示坐标应映射到的值。请注意,在每一行之后都会跳过一个索引。我认为它最终会成为一个相当微不足道的解决方案,但我找不到任何类似的问题,而且我自己也没有任何运气提出想法。我确实知道二维数组的宽度和高度。感谢您的帮助!


我的问题可能含糊不清或使用了错误的术语,我深表歉意。

我知道坐标 (0,0) 将是左下角的位置。我也知道左上角坐标应该放在索引 0 处。每个新行都会跳过一个索引 1。坐标系的大小各不相同,但我知道行数和列数。

【问题讨论】:

  • 映射通常需要地图。你可以使用Map<Integer, Point>
  • @Dukeling:可能。我还没有真正理解这个问题......
  • 不要认为映射是必要的,他需要知道映射在数学上是如何发生的(得到一个函数),映射更多的是用于存储(如果需要)他只想要索引。致 OP:索引 7 和 3 发生了什么?
  • 看来您可能需要一个映射以下内容的通用函数:(0,n-1)->0, (1,n-1)->1, ..., (n-1,n-1)->n-1, (0, n-2)->n+1, (1, n-2)->n+2, ...。这个对吗? (在你的例子中 n = 3)
  • @arynaq 这是代表​​字符值的映射坐标点,所以我有那些索引为 toString() 方法保存换行符

标签: java arrays algorithm coordinates


【解决方案1】:

第一步,将数值上下颠倒,保持点完整:

(0,2)->8 (1,2)->9 (2,2)->10
(0,1)->4 (1,1)->5 (2,1)->6
(0,0)->0 (1,0)->1 (2,0)->2

您会注意到y 对输出的影响为 4 倍,x 为 1 倍。

因此我们得到一个非常简单的4y + x

现在回到原来的,你会注意到变换是(x,y) <- (x,2-y)(也就是说,如果我们用这个变换来变换上面的每个点,我们就会得到原来需要的映射)。

因此,将其代入等式,我们得到(2-y)*4 + x

现在这是特定于 3x3,但我相信您可以通过用变量替换 2 和 4 来概括它。

【讨论】:

  • 当然 - 谢谢!一开始我没想过将问题颠倒过来让它更直观。
  • 我没有看到巨大的差距,但我的回答是暗示这一点。
【解决方案2】:

如果您想减小尺寸并避免重叠,您需要一条空间填充曲线,例如莫顿曲线。您的示例看起来像 peano 曲线,因为它是 3x3 矩阵。这些曲线很难计算,但有一些不错的东西。但是,如果您只是寻找自我避免的曲线,您可以创建自己的曲线吗?在这里阅读:http://www.fractalcurves.com/Root4Square.html

【讨论】:

  • 嗯,你WAY把事情复杂化了。这些数字有一个很好的小模式。
  • 我更正了我的答案。这是关于减少尺寸和非重叠曲线。他当然可以使用任何自我回避曲线?
  • morton 代码是一种专业的方式,特别是对于大量具有高效存储使用的节点。那么你就不再需要地图了。
【解决方案3】:

我被公式打败了,这是使用地图的蛮力。

public class MapPointToIndex {
private Map<Point, Integer> map;
private int index, rowcount;

public MapPointToIndex(int rows, int columns) {
    map = new HashMap<Point, Integer>();
    for (int i = rows - 1; i >= 0; i--) {
        index += rowcount;
        for (int j = 0; j < columns; j++) {
            Point p = new Point(j, i);
            map.put(p, index);
            index++;
        }
        rowcount = 1;
    }
}

public int getIndex(Point point){
    return map.get(point);
}

public static void main(String[] args) {
    MapPointToIndex one = new MapPointToIndex(3, 3);
    System.out.println(one.map);

}
}

输出:

{java.awt.Point[x=0,y=0]=8, java.awt.Point[x=2,y=2]=2, java.awt.Point[x=1,y=2]=1, java.awt.Point[x=2,y=1]=6, java.awt.Point[x=1,y=1]=5, java.awt.Point[x=2,y=0]=10, java.awt.Point[x=0,y=2]=0, java.awt.Point[x=1,y=0]=9, java.awt.Point[x=0,y=1]=4}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-11
    • 2013-09-05
    • 2015-09-10
    相关资源
    最近更新 更多