正六边形:判断点是否在正六边形内

 前文 正六边形:平铺中函数

//根据坐标计算网格信息
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);
}

逻辑存在BUG,处于边界时计算有误,需要判断点是否在正六边形内进行纠偏处理。

如何判断点是否在正六边形内?

把正六边形分解,将问题转换为,点是否在矩形IGDJ或三角形GCD内;

 

设dx,dy分别为点到正六边形中心点的差值【>=0】,

若点在矩形内,则dx必然在IG区间【dx<1】且dy在IJ区间【dy<1.73】

若点在三角形内,则dx必然在GC区间【1<dx<2】且dy在DC线的下方【以G点为原点,DC线的坐标关系描述为y= -1.73x+1.73】

代码实现如下:

const int cubeSideLen = 2;
const int halfSideLen = cubeSideLen * 0.5;
const double mathSqrt3 = 1.732051;
const double cubeSideLen_X_mathSqrt3 = cubeSideLen * mathSqrt3;

class Grid
{
public:
	Grid() {}
	Grid(int x, int y, int z = 0) {
		this->x = x;
		this->y = y;
		this->z = z;
	}

	int x = 0;
	int y = 0;
	int z = 0;
	
	//六边形中心坐标
	double posX = 0;
	double posY = 0;

	//指定坐标是否在六边形内
	bool posInGrid(const double &posX, const double &posY) 
	{
		double dx = std::abs(this->posX - posX);
		double dy = std::abs(this->posY - posY);
		if (dx <= halfSideLen)
		{
			return dy <= halfSideLen * mathSqrt3;
		}
		else
		{
			int maxY = -mathSqrt3 * (dx - halfSideLen) + halfSideLen * mathSqrt3;
			return dy < maxY;
		}
	}
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值