- 积分
- 10090
- 明经币
- 个
- 注册时间
- 2022-2-7
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
发表于 2023-5-13 15:00:40
|
显示全部楼层
本帖最后由 橡皮 于 2023-5-13 15:02 编辑
程序很顶,提供帮助极大,我在试用期间有以下疑问或者说问题(以添加圆为例,进行说明):
1. 创建新节点的时候(代码964行),此处按理应该是先添加叶子节点 GQtree之后把数据添加上,以下代码会以待添加的圆圆心当做叶子节点的左下角,效果如下:
- n->child[index] = new nodeType(x, y, r, data);
- n->node_size -= 1;
复制代码
2. 判断两圆相交(259行处函数),这个计算原理是啥,想了半天没明白,我换了一种方法也贴在下边
- // 两圆是否相交
- bool Intersect(const nodeType* n, COOR_TYPE x, COOR_TYPE y, COOR_TYPE r) const
- {
- COOR_TYPE x0 = (n->x + n->x1) / 2;
- COOR_TYPE y0 = (n->y + n->y1) / 2;
- COOR_TYPE vx = x > x0 ? x - x0 : x0 - x;
- COOR_TYPE vy = y > y0 ? y - y0 : y0 - y;
- COOR_TYPE hx = n->x > x0 ? n->x - x0 : x0 - n->x;
- COOR_TYPE hy = n->y > y0 ? n->y - y0 : y0 - n->y;
- COOR_TYPE ux = vx > hx ? vx - hx : 0;
- COOR_TYPE uy = vy > hy ? vy - hy : 0;
- return ux * ux + uy * uy <= r * r;
- }
- bool Intersect(const nodeType* n, const COOR_TYPE& x, const COOR_TYPE& y, const COOR_TYPE& r) const
- {
- COOR_TYPE delta = n->r + r;
- COOR_TYPE left = n->x - delta;
- COOR_TYPE right = n->x1 + delta;
- COOR_TYPE top = n->y1 + delta;
- COOR_TYPE bottom = n->y - delta;
-
- if (Inbound(left, bottom, right, top, x, y)) return true;
- else return false;
- //// 详细筛选规则
- //if (Between(left, right, x) && Between(n->y, n->y1, y)) return true;
- //if (Between(bottom, top, y) && Between(n->x, n->x1, x)) return true;
- //if (InReach(n->x, n->y, x, y, delta) || InReach(n->x1, n->y, x, y, delta) || InReach(n->x1, n->y1, x, y, delta) || InReach(n->x, n->y1, x, y, delta)) return true;
- //else return false;
- }
复制代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
x
评分
-
查看全部评分
|