Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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
Algorithm 如何检测某个范围是否(部分)位于另一个范围内?_Algorithm_Math_Comparison_Tree - Fatal编程技术网

Algorithm 如何检测某个范围是否(部分)位于另一个范围内?

Algorithm 如何检测某个范围是否(部分)位于另一个范围内?,algorithm,math,comparison,tree,Algorithm,Math,Comparison,Tree,假设我有两个正方形,我知道它们的位置,一个红色和蓝色的正方形: redTopX; redTopY; redBotX; redBotY; blueTopX; blueTopY; blueBotX; blueBotY; 现在,我想检查方形蓝色是否(部分)位于方形红色内(或周围)。这种情况在很多情况下都会发生,正如您在我为更好地说明我的情况而创建的这张图片中所看到的: 请注意,始终只有一个蓝色和一个红色正方形,我只是添加了多个,所以我不必重画18次 我最初的逻辑很简单,我会检查蓝色方格的所有角落,

假设我有两个正方形,我知道它们的位置,一个红色和蓝色的正方形:

redTopX;
redTopY;
redBotX;
redBotY;
blueTopX;
blueTopY;
blueBotX;
blueBotY;
现在,我想检查方形蓝色是否(部分)位于方形红色内(或周围)。这种情况在很多情况下都会发生,正如您在我为更好地说明我的情况而创建的这张图片中所看到的:

请注意,始终只有一个蓝色和一个红色正方形,我只是添加了多个,所以我不必重画18次

我最初的逻辑很简单,我会检查蓝色方格的所有角落,看看它们是否在红色方格内:

if (
((redTopX >= blueTopX) && (redTopY >= blueTopY) && (redTopX <= blueBotX) && (redTopY <= blueBotY)) || //top left
((redBotX >= blueTopX) && (redTopY >= blueTopY) && (redBotX <= blueBotX) && (redTopY <= blueBotY)) || //top right
((redTopX >= blueTopX) && (redBotY >= blueTopY) && (redTopX <= blueBotX) && (redBotY <= blueBotY)) || //bottom left
((redBotX >= blueTopX) && (redBotY >= blueTopY) && (redBotX <= blueBotX) && (redBotY <= blueBotY)) //bottom right
) {
    //blue resides in red
}
if(

((redTopX>=blueTopX)&&&(redTopY>=blueTopY)&&(redTopX=blueTopY)&&&(redTopX=blueTopY)&&&(redTopX两个矩形相交的一个公式为

! ( (redTopX > blueBotX) || (blueTopX > redBotX) || (redTopY < blueBotY) || (blueTopY < redBotY))
!((红豆>蓝豆)| | |(蓝豆>红豆)| | |(红豆<蓝豆)| |(蓝豆<红豆))

您可以使用DeMorgan定理来简化。

假设两个正方形对齐,如您所示:

如果以下所有条件均成立,则正方形相交:

  • 红色的左侧是蓝色的右侧的左侧
  • 红色的右侧是蓝色的左侧的右侧
  • 红色的顶部在蓝色的底部上方
  • 红色的底部低于蓝色的顶部
  • (说服自己这是真的!)

    if(blueTopY红豆)返回(0);
    如果(蓝莓<红豆)返回(0);
    如果(blueTopX>redBotX)返回(0);
    return(1);//一定有冲突
    
    检查红色矩形是否完全位于蓝色矩形之外的测试如下所示

    bool outside = 
      redBotX > blueTopX || redTopX < blueBotX || 
      redBotY > blueTopY || redTopY < blueBotY;
    
    bool intersects =
      redTopX <= blueBotX && redBotX >= blueTopX && 
      redTopY <= blueBotY && redBotY >= blueTopY;
    
    要处理这种情况,您只需在所有条件下交换
    Bot
    Top
    坐标

    bool outside = 
      redBotX > blueTopX || redTopX < blueBotX || 
      redBotY > blueTopY || redTopY < blueBotY;
    
    bool intersects =
      redTopX <= blueBotX && redBotX >= blueTopX && 
      redTopY <= blueBotY && redBotY >= blueTopY;
    
    bool相交=
    redTopX=blueTopX&&
    redTopY=blueTopY;
    
    对于更高维度的范围,或者如果您想检查许多范围,可能值得将您的范围(例如,它们的中心)存储在a中,并搜索范围的角点位置。

    可能重复我在测试之前错误地接受了您的答案,它实际上不起作用。redBotX(因为上面的所有示例都需要返回true,无论您是查看红色在蓝色内还是蓝色在红色内。)if(RectA.X1RectB.X1&&RectA.Y1RectB.Y1)看起来很有效。@Tom:答案中的所有内容都很完美。唯一的问题是,在答案中,我假设了矩形的不同表示形式(我在最后清楚地说明了它-请参见断言)。在我的假设中,
    Bot
    表示最小坐标,
    Top
    表示最大坐标。即,每个矩形由其左下角和右上角表示。在您的情况下,它是右下角和左上角。如果您坚持表示,只需更新比较(到处交换
    …BotX
    …TopX
    )。虽然我认为您的初始表示非常…奇怪(为什么?)。坐标总是从最低(顶部)到最高(底部)。例如,看看您的屏幕分辨率。顶部表示左上角的X和Y,而Bot表示右下角的X和Y。
    bool intersects =
      redBotX <= blueTopX && redTopX >= blueBotX && 
      redBotY <= blueTopY && redTopY >= blueBotY;
    
    assert(redBotX <= redTopX && redBotY <= redTopY);
    assert(blueBotX <= blueTopX && blueBotY <= blueTopY);
    
    assert(redTopX <= redBotX && redTopY <= redBotY);
    assert(blueTopX <= blueBotX && blueTopY <= blueBotY);
    
    bool intersects =
      redTopX <= blueBotX && redBotX >= blueTopX && 
      redTopY <= blueBotY && redBotY >= blueTopY;