将唯一点映射到唯一整数索引

时间:2013-05-29 16:18:24

标签: java arrays algorithm coordinates

我对坐标系统或处理这些事情的大部分数学都不熟悉。我想要做的是取一个点(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.坐标系的大小会有所不同,但我知道行数和列数。

3 个答案:

答案 0 :(得分:2)

第一步,颠倒值,保持积分:

(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来概括它。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

我被殴打了公式,这是使用Map的暴力。

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}