Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么这个四叉树查询通常不返回任何结果?_Java_Search_Processing_Collision Detection_Quadtree - Fatal编程技术网

Java 为什么这个四叉树查询通常不返回任何结果?

Java 为什么这个四叉树查询通常不返回任何结果?,java,search,processing,collision-detection,quadtree,Java,Search,Processing,Collision Detection,Quadtree,任何“W”表示半宽,任何“H”表示半高。任何“X”和“Y”表示与坐标轴对齐的矩形的中心 我正在尝试编写一些通用的四叉树代码,用于物理模拟和游戏设计。起初,它返回完全由搜索区域包围的四叉树内容中的所有点。在添加了一系列print()语句来说明这个过程之后,我设法解决了这个问题,但现在我有了一个新的问题,我似乎无法解决。出于某种原因,当我在四叉树中查询矩形区域内的“可放置项”时,我要么得到完全正确的结果,但更多的时候,我没有得到任何返回。可放置项的定义如下: abstract class Place

任何“W”表示半宽,任何“H”表示半高。任何“X”和“Y”表示与坐标轴对齐的矩形的中心

我正在尝试编写一些通用的四叉树代码,用于物理模拟和游戏设计。起初,它返回完全由搜索区域包围的四叉树内容中的所有点。在添加了一系列print()语句来说明这个过程之后,我设法解决了这个问题,但现在我有了一个新的问题,我似乎无法解决。出于某种原因,当我在四叉树中查询矩形区域内的“可放置项”时,我要么得到完全正确的结果,但更多的时候,我没有得到任何返回。可放置项的定义如下:

abstract class Placeable{ //things that can be stored in quadtree
  PVector pos;
  abstract void show();}
         !(400 >= 512 || 600 <= 512)
/*-->*/  !(false || false)
/*-->*/  true //(yes, they intersect)
四叉树代码的重要部分:

class Quadtree{ //Data structure for storing objects in 2D
  Quadtree nw,ne,sw,se; //children
  Quadtree parent;
  ArrayList<Placeable> contents;//contents of THIS branch only, child object contents not included
  float x,y,w,h;//center point, half-width and half-height
  boolean divided;  //false if leaf node
  static final int capacity = 6; //controls maximum capacity all quadtree nodes for case-by-case tuning 
...

...
boolean intersects(float rX, float rY, float rW, float rH){//Do I intersect with the rectangle defined by rX,rY,rW,rH?
    return !(rX-rW >= x+w || rX+rW <= x-w 
          || rY-rH >= y+h || rY+rH <= y-h);}
      
  //return all Placeables inside a rectangular region
  ArrayList<Placeable> query(float X, float Y, float W, float H){
    return query(X,Y,W,H,new ArrayList<Placeable>());}
  ArrayList<Placeable> query(float X, float Y, float W, float H, ArrayList<Placeable> found){
    print("Querying:",contents.size(),"/",Integer.toString(capacity),"\t");
    
    if (!intersects(X,Y,W,H)){ //if no intersection, return arraylist unmodified
      print("Does Not Intersect\n");
      return found;
    } else {  //if intersection, check contents for Placeables within the region
      print("Does Intersect!\n");
      for (Placeable p : contents){
        if ( (p.pos.x <= X+W) && (p.pos.x >= X-W) //capitals refer to search region
          && (p.pos.y <= Y+H) && (p.pos.y >= Y-H) ){
          found.add(p);
          print("Found Point\t",p.pos.x,"\t",p.pos.y,"\n");}
      }
      if (divided){ //after checking own contents, recursively query children appending to same array
        print("Descending\n");
        print("NW ");
        nw.query(X,Y,W,H,found);
        print("NE ");
        ne.query(X,Y,W,H,found);
        print("SW ");
        sw.query(X,Y,W,H,found);
        print("SE ");
        se.query(X,Y,W,H,found);
        print("Raising\n");}
      return found;
    }
  }
.....
}
正确的输出图像:

以下是同一窗口中不正确输出的示例,该窗口应返回3个点:

Querying: 6 / 6     Does Intersect!
Descending
NW Querying: 6 / 6  Does Not Intersect
NE Querying: 6 / 6  Does Not Intersect
SW Querying: 6 / 6  Does Intersect!
Descending
NW Querying: 3 / 6  Does Not Intersect
NE Querying: 5 / 6  Does Not Intersect
SW Querying: 6 / 6  Does Not Intersect
SE Querying: 6 / 6  Does Not Intersect
Raising
SE Querying: 6 / 6  Does Not Intersect
Raising
Found: 0 
这是伴随错误输出的窗口。(发现的点变为纯绿色。)

我还没有发现一个区域产生正确输出的模式,但我的直觉告诉我,左边的区域更经常是不正确的


完整的文件是可用的,所以你可以运行它,如果你需要,但我很难办,我已经回来了几次,在过去的一周。请帮忙。

哇,这是一个很难找到的问题(至少,我希望我解决了它)

问题在于您在
setup()
中对
rW
rH
的定义:

rW
rH
不能为负值。例如,假设我们测试以下值(假设
y
值也相交):

理想情况下,
intersects()
将进行如下测试:

abstract class Placeable{ //things that can be stored in quadtree
  PVector pos;
  abstract void show();}
         !(400 >= 512 || 600 <= 512)
/*-->*/  !(false || false)
/*-->*/  true //(yes, they intersect)

我知道当问题解决的时候我会觉得自己是个十足的白痴,非常感谢。我从来没有想过我会有负矩形。我现在意识到我甚至没有包括有问题的代码!非常感谢你。我将在适当的函数中包含LBYL测试。我不知道要花多长时间才能找到这个,因为考试,我没有时间。我知道我们不应该留下“谢谢”的评论,但这是一个相当不活跃的帖子,所以我希望它可以。你们在考试期间帮了我很多忙,而这是一个我不能花这么多时间去做的项目。
         !(400 >= 512 || 600 <= 512)
/*-->*/  !(false || false)
/*-->*/  true //(yes, they intersect)
         !(rX-rW >= x+w || rX+rW <= x-w)
/*-->*/  !(500-(-100) >= 256+256 || 500+(-100) <= 256-256)
/*-->*/  !(600 >= 512 || 400 <= 0)
/*-->*/  !(true || false)
/*-->*/  false //(no, they do not intersect)
rW = abs(constrain(randomGaussian(),-1,1))*width/6;
rH = abs(constrain(randomGaussian(),-1,1))*height/6;