通过id获取等距单元格的X,Y坐标

时间:2014-04-15 15:39:31

标签: java isometric

enter image description here

我有一个等距网格,编号如上图所示。我需要一个从给定的单元格号返回X,Y坐标的函数,而不使用任何类型的loops

我花了好几个小时试图解决这个问题,这是我到目前为止所提出的:

public static Coords getXY(int cellID)
{       
    final double CELL_WIDTH     = 53;
    final double LEVEL_HEIGHT   = 27;
    final int gridWidth         = 6;

    boolean isYellowRow = cellID % (gridWidth*2-1) <= gridWidth;        

    double x = ((cellID % gridWidth) + 1) + (isYellowRow ? 0 : 0.5 );

    double y = cellID / (gridWidth*2-1);
    y = Math.round(y) + (isYellowRow ? 1 : 0);

    System.out.println(x+", "+y);

    x *= CELL_WIDTH;
    y *= LEVEL_HEIGHT;

    System.out.println(x+", "+y);

    return Coords(x, y);
}

凌乱不行,但还没有完成,我花了比这更多的时间,我还是无法解决,所以我&#39我请你帮忙。

预期结果的一些例子:

getXY(1); // Should return: 53, 27
getXY(2); // Should return: 106, 27
getXY(6); // Should return: 26.5, 40.5 (40.5 is because +=cellHeight/2..)
getXY(7); // Should return: 79.5, 40.5
getXY(12); // Should return: 53, 54

1 个答案:

答案 0 :(得分:3)

试试这个

int n;         // cell number
double x, y;   // coordinates of top vertex of cell
double CELL_WIDTH = 53;
double LEVEL_HEIGHT = 27;

x = (double)(((n-1)%11) * CELL_WIDTH) - (((n-1)%11 > 4) ? 5.5d*CELL_WIDTH : 0d);
y = (double)((n-1)/11) * LEVEL_HEIGHT * 2d + (((n-1)%11 > 4)  ? LEVEL_HEIGHT/2  : 0d);

这会将(0,0)放在第一个单元格的顶部顶点。添加偏移量(0,0)可以在任何地方移动。

方法:

重复模式具有期间11,分为两行。因此,首先计算水平偏移,就像11个单元格在一条直线上一样:((n-1)%11) * CELL_WIDTH。然后意识到如果单元格在第二行,则水平偏移将留下5-1 / 2个单元格:- ((n-1)%11 > 4) ? 5.5d*CELL_WIDTH : 0d。对垂直偏移执行相同操作并投入适当的投射,因此结果是浮点(因为您似乎想要半像素答案)。