如何将六边形网格的顶点位置存储在二维数组中?

3

我遇到了这个问题。我想创建一个六边形网格,并能够以以下方式进行创建:

//grid extents
int numCols,numRows;
for (int i=0; i<numCols; ++i){
 for (int j=0; j<numRows; ++j){

 //x and y coordinates of my hexagon's vertices
 float xpos,ypos;


 //2D array storing verteces of my hextopology  
 vertices[i][j] = new VertexClass(xpos, ypos);

 // statements to change xpos/ypos and create hex
 } 
}

我找到的所有制作六边形网格的方法,都是首先创建一个六边形对象,然后在网格上复制它,从而创建重复的顶点位置并连接边缘。我想避免重复顶点位置。如何声明语句来制作这样的网格?
谢谢
1个回答

4

假设六边形一条边的长度为L,我们用以下方式表示六边形中第i列和第j行的顶点:

 i 0   0  1   1    2   2   3...
j     \     /         \     /
0    . A---o .       . o---o
      /     \         /     \
     /       \       /
    /         \     / 
1 -o .       . o---o .
    \         /     \
     \       /       \
      \     /         \     /
2    . o---o .       . o---o
      /     \         /     \

(x,y)成为顶点A(左上角)的坐标。

然后,每行的y坐标向上移动L*sqrt(3)/2。如果我们从顶点沿着x方向以L/4的距离查看六边形上的点,则很容易计算出x坐标。这些点(用点标记)与X方向的距离为L*3/2,构成了格点。

因此:

vertices[i][j] = Vertex( x - L/4 + i*L*3/2 + L/4*(-1)^(i+j), y - j*L*sqrt(3)/2 )

一个六边形的顶点索引类型为:(i,j), (i+1,j), (i+1,j+1), (i+1,j+2), (i,j+2), (i,j+1)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接