0

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

4

3 回答 3

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它对输出的影响是 4x倍和 1 倍。

这样我们就得到了一个非常简单的4y + x.

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

所以,把它代入方程,我们得到(2-y)*4 + x

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

于 2013-05-29T16:52:18.123 回答
1

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

于 2013-05-29T16:39:27.710 回答
1

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

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}
于 2013-05-29T17:09:14.720 回答