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