c++ 快速矩形求交

jhkqcmku  于 2023-06-25  发布在  其他
关注(0)|答案(7)|浏览(149)

有什么快速的方法来测试两个矩形是否相交?
在互联网上搜索了这个一行字(哇!),但我不明白如何用JavaScript编写,它似乎是用C++的一种古老形式编写的。

struct
{
    LONG    left;
    LONG    top;
    LONG    right;
    LONG    bottom;
} RECT; 

bool IntersectRect(const RECT * r1, const RECT * r2)
{
    return ! ( r2->left > r1->right
        || r2->right < r1->left
        || r2->top > r1->bottom
        || r2->bottom < r1->top
        );
}
5lhxktic

5lhxktic1#

这就是如何将代码转换为JavaScript。请注意,在您的代码中以及本文的代码中有一个错别字,正如注解所建议的那样。具体来说,r2->right left应该是r2->right < r1->leftr2->bottom top应该是r2->bottom < r1->top,函数才能正常工作。

function intersectRect(r1, r2) {
  return !(r2.left > r1.right ||
    r2.right < r1.left ||
    r2.top > r1.bottom ||
    r2.bottom < r1.top);
}

// Test case:

var rectA = {
  left: 10,
  top: 10,
  right: 30,
  bottom: 30
};

var rectB = {
  left: 20,
  top: 20,
  right: 50,
  bottom: 50
};

var rectC = {
  left: 70,
  top: 70,
  right: 90,
  bottom: 90
};

console.log(intersectRect(rectA, rectB)); // returns true
console.log(intersectRect(rectA, rectC)); // returns false
dnph8jn4

dnph8jn42#

function intersect(a, b) {
  return (a.left <= b.right &&
          b.left <= a.right &&
          a.top <= b.bottom &&
          b.top <= a.bottom)
}

这假设top通常小于bottom(即y坐标向下增加)。

8mmmxcuj

8mmmxcuj3#

这就是. NETFramework实现Rectangle.Intersect的方式

public bool IntersectsWith(Rectangle rect)
{
  if (rect.X < this.X + this.Width && this.X < rect.X + rect.Width && rect.Y < this.Y + this.Height)
    return this.Y < rect.Y + rect.Height;
  else
    return false;
}

静态版本:

public static Rectangle Intersect(Rectangle a, Rectangle b)
{
  int x = Math.Max(a.X, b.X);
  int num1 = Math.Min(a.X + a.Width, b.X + b.Width);
  int y = Math.Max(a.Y, b.Y);
  int num2 = Math.Min(a.Y + a.Height, b.Y + b.Height);
  if (num1 >= x && num2 >= y)
    return new Rectangle(x, y, num1 - x, num2 - y);
  else
    return Rectangle.Empty;
}
rvpgvaaj

rvpgvaaj4#

另一个更简单的方法。(假设y轴向下增加)。

function intersect(a, b) {
  return Math.max(a.left, b.left) < Math.min(a.right, b.right) &&
          Math.max(a.top, b.top) < Math.min(a.bottom, b.bottom);
}

上述条件中的4个数字(max和min)也给予了交点。

91zkwejq

91zkwejq6#

我使用了混合的方法,在一个大矩形中检测一个较小的矩形。这是一种节点方法,并且使用宽度/高度,但是可以很容易地适应。

isIntersectingRect: function (r1, r2) {
              var quickCheck = (r1.x <= r2.x + r2.w &&
                      r2.x <= r1.x + r1.w &&
                      r1.y <= r2.y + r2.h &&
                      r2.y <= r1.y + r1.h)
              if (quickCheck) return true;
              var x_overlap = Math.max(0, Math.min(r1.x + r1.w, r2.x + r2.w) - Math.max(r1.x, r2.x));
              var y_overlap = Math.max(0, Math.min(r1.y + r1.h, r2.y + r2.h) - Math.max(r1.y, r2.y));
              var overlapArea = x_overlap * y_overlap;
              return overlapArea == 0;
            }
vsikbqxv

vsikbqxv7#

当前的.NET方式很简单

public bool IsEmpty => _width < 0.0;   

    public bool IntersectsWith(Rect rect)
    {
        if (IsEmpty || rect.IsEmpty)
        {
            return false;
        }

        if (rect.Left <= Right && rect.Right >= Left && rect.Top <= Bottom)
        {
            return rect.Bottom >= Top;
        }

        return false;
    }

相关问题