Если myImage
- ваше изображение 256x256, не будет ли это
image_top_left = myImage(1:128,1:128);
image_top_right = myImage(1:128,129:256);
image_bottom_left = myImage(129:256,1:128);
image_bottom_right = myImage(129:256,129:256);
?
Вот как этот код можно преобразовать в JavaScript. Обратите внимание, что в вашем коде и в статье есть опечатка, как предполагалось в комментариях. В частности, r2-> right left
должно быть r2-> right
, а r2-> bottom top
должно быть r2-> bottom
, чтобы функция работала.
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
Я использовал смешение методов, для обнаружения меньшего прямоугольника в большом прямоугольнике. Это - 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;
}
function intersect(a, b) {
return (a.left <= b.right &&
b.left <= a.right &&
a.top <= b.bottom &&
b.top <= a.bottom)
}
Предполагается, что верхний
обычно меньше, чем нижний
(т.е. y
координаты увеличиваются вниз).