我有一个等距网格,编号如上图所示。我需要一个从给定的单元格号返回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
答案 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
。对垂直偏移执行相同操作并投入适当的投射,因此结果是浮点(因为您似乎想要半像素答案)。