yonjay 发表于 2022-12-7 08:27:15

g大好崇拜您啊,厉害

gzxl 发表于 2022-12-7 09:14:52

yonjay 发表于 2022-12-7 08:27
g大好崇拜您啊,厉害

哥我只是个菜鸟,又不是你的女神;P

橡皮 发表于 2023-5-13 15:00:40

本帖最后由 橡皮 于 2025-5-27 15:29 编辑

程序很顶,提供帮助极大,我在试用期间有以下疑问或者说问题(以添加圆为例,进行说明):
1. 创建新节点的时候(代码964行),此处按理应该是先添加叶子节点 GQtree之后把数据添加上,以下代码会以待添加的圆圆心当做叶子节点的左下角,效果如下:
n->child = 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;
}


<blockquote>bool Intersect(const Node* node, COOR_TYPE x, COOR_TYPE y, COOR_TYPE r) const {

why1025 发表于 2023-7-10 17:06:42

牛B,厉害,能不能继续优化,添加功能

gzxl 发表于 2023-7-10 20:41:13

why1025 发表于 2023-7-10 17:06
牛B,厉害,能不能继续优化,添加功能

俺能力不够,等你优化后共享下。

cable2004 发表于 2023-7-11 08:43:45

师傅领进门,修行在个人。
感谢gzxl大师的分享!

why1025 发表于 2023-7-11 22:01:58

// 搜索指定宽、高内的节点(点的x y值 宽w 高h)
      void Search(const nodeType* n, COOR_TYPE x, COOR_TYPE y, COOR_TYPE w, COOR_TYPE h, std::vector<const nodeType*>& result) const
      {
            if (n != NULL)
            {
                if (n->leaf)
                {
                  acutPrintf(_T("n->leaf true"));
                                        // 判断两个矩形是否相交
                  if (Intersect(n->x, n->y, n->w, n->h, x, y, w, h))
                  {
                        acutPrintf(_T(" push_back"));
                        result.push_back(n);
                  }
                }
                else if (Intersect(n, x, y, w, h) && n->node_size > 0)
                {
                  acutPrintf(_T("n->leaf false"));
                                        for (int i = 0; i < 4; i++)
                  {
                        if (n->child)
                        {
                            Search(n->child, x, y, w, h, result);
                            acutPrintf(_T("n->node Search"));
                        }
                  }
                }
            }
      }

这段矩形碰撞的原理是什么???为什么判断两个矩形碰撞,先要判断一个矩形和另一个的nodeType,也就是另一个矩形所在的节点是否碰撞???我测试的例子大部分都是检查出来了,就有一个怎么都不对,这个没检查出来的就是我说的这种,一个矩形和节点没碰撞,但是和这个节点里的一个child是碰撞的,不知道我这么理解对不对,这导致循序直接跳过这个nodeType,他的四个child也被跳过了,想完善完善还是能力不足,问题先放着,先谢谢g大,确实牛b

橡皮 发表于 前天 15:32

橡皮 发表于 2023-5-13 15:00
程序很顶,提供帮助极大,我在试用期间有以下疑问或者说问题(以添加圆为例,进行说明):
1. 创建新节点 ...

换了种方式,话说啥时候 G大把这个代码再上传一下啊,私发也行

你有种再说一遍 发表于 前天 23:16

橡皮 发表于 2025-5-27 15:32
换了种方式,话说啥时候 G大把这个代码再上传一下啊,私发也行

能用就行了啊,四叉树能有啥不一样的,直接问问AI去矫正一下不良就好了
页: 1 [2]
查看完整版本: ObjectARX之四叉树例子Source