项目需要,最新在学习正六边形的相关知识,做个记录。
正六边形的相关特性不多说了,网上有很多介绍,直接上代码
平铺代码如下:
const double sqrt3 = 1.732051;
const int sideLen = 50;
const int rowGridNum = 14;
const int colGridNum = 8;
void HelloWorld::addSixSideGrid()
{
char buff[32] = { 0 };
for (int i = 0; i <= rowGridNum; i++)
{
for (int j = 0; j <= colGridNum; ++j)
{
auto sp = Sprite::create("six_side.png");
auto pos = this->getPosByGrid(i, j);
sp->setPosition(pos);
this->addChild(sp);
auto txt = ui::Text::create();
if (i == rowGridNum / 2 && j == colGridNum / 2)
{
txt->setString("start");
}
else
{
sprintf(buff, "%d,%d", i, j);
txt->setString(buff);
}
txt->setTextColor(Color4B::BLACK);
txt->setFontSize(24);
sp->addChild(txt);
txt->setPosition(sp->getContentSize() * 0.5);
}
}
}
//根据网格信息计算坐标
Vec2 HelloWorld::getPosByGrid(const int& gridX, const int& gridY)
{
Vec2 pos = Vec2::ZERO;
pos.x = gridX * sideLen * 1.5;
if (gridX % 2 == 0)
{
pos.y = sideLen * sqrt3 * gridY;
}
else
{
pos.y = sideLen * sqrt3 * (gridY - 0.5);
}
return pos;
}
//根据坐标计算网格信息
Vec2 HelloWorld::getGridByPos(const Vec2& pos)
{
int girdX = pos.x/ (1.5 * sideLen)+0.5;
int girdY = 0;
if (girdX % 2 == 0)
{
girdY = pos.y / (sideLen * sqrt3) + 0.5;
}
else
{
girdY = pos.y / (sideLen * sqrt3) + 1;
}
return Vec2(girdX, girdY);
}
效果图如下【其他平铺方式可以通过偏移坐标实现】: