거기에서 어디로의 빠른 교차
두 개의 모든 부분이 교차하는지 테스트하는 빠른 방법은 무엇입니까?
인터넷 고대 검색 결과가 한 줄짜리 (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;
}
또 다른 간단한 방법입니다. (이것은 축이 낮다고 생각합니다.)
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
큰 사각형 안에있는 작은 사각형을 감지하기 위해 여러 가지 방법을 사용했습니다. 이것은 nodejs 방법이며 너비 / 높이를 사용하지만 쉽게 조정할 수 있습니다.
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;
}
참고 URL : https://stackoverflow.com/questions/2752349/fast-rectangle-to-rectangle-intersection
'ProgramingTip' 카테고리의 다른 글
라디오 버튼 AngularJS 유효성 검사 (0) | 2020.10.13 |
---|---|
카피 스트라 노를 사용하여 이전에 배포 된 버전으로 어떻게 롤백하고 있습니까? (0) | 2020.10.13 |
find 및 sed를 사용하여 재귀 적으로 파일 이름 (0) | 2020.10.13 |
NuGet 업그레이드 문제 (0) | 2020.10.13 |
Android에서 페인트 플래그 제거 (0) | 2020.10.13 |