ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-04-24 15:59:47  阅读:352  来源: 互联网

标签:判断 const int 是否 dx double 六边形 girdY


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

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

 

标签:判断,const,int,是否,dx,double,六边形,girdY
来源: https://blog.csdn.net/auccy/article/details/116090204

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有