2つの長方形が交差しているかどうかをテストする迅速な方法は何ですか?
インターネットで検索すると、このワンライナー(WOOT!)が出てきましたが、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
);
}
これは、そのコードをJavaScriptに変換する方法です。コメントに示されているように、コード内および記事のタイプミスがあることに注意してください。具体的にはr2->right left
はr2->right < r1->left
およびr2->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);
}
テストケース:
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
};
intersectRect(rectA, rectB); // returns true
intersectRect(rectA, rectC); // returns false
function intersect(a, b) {
return (a.left <= b.right &&
b.left <= a.right &&
a.top <= b.bottom &&
b.top <= a.bottom)
}
これは、top
が通常bottom
よりも小さいことを前提としています(つまり、y
座標が下向きに増加すること)。
これは、.NET Frameworkが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;
}
別のより簡単な方法。 (これは、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つの数値(最大値と最小値)も交点を示します。
これには、使用できるRectタイプがあります。すでにJavaScriptです。
https://dxr.mozilla.org/mozilla-beta/source/toolkit/modules/Geometry.jsm