2026-07-16 12:37:56 +03:00
|
|
|
/**
|
|
|
|
|
* Вычисляет пересеклись ли два объекта по ААBB формуле в системе координат где ось X идет справа налево, ось Y идет сверху вних
|
|
|
|
|
* @param {Object} firstObject - первый объект
|
|
|
|
|
* @param {number} firstObject.left - Min X координата первого объекта
|
|
|
|
|
* @param {number} firstObject.right - Max X координата первого объекта
|
|
|
|
|
* @param {number} firstObject.top - Min Y координата первого объекта (ось смотрит вниз)
|
|
|
|
|
* @param {number} firstObject.bottom - Max Y координата первого объекта
|
|
|
|
|
* @param {Object} secondObject - второй объект
|
|
|
|
|
* @param {number} secondObject.left - Min X координата второго объекта
|
|
|
|
|
* @param {number} secondObject.right - Max X координата второго объекта
|
|
|
|
|
* @param {number} secondObject.top - Min Y координата второго объекта (ось смотрит вниз)
|
|
|
|
|
* @param {number} secondObject.bottom - Max Y координата второго объекта
|
|
|
|
|
* @returns {boolean}
|
|
|
|
|
*/
|
2026-07-19 17:00:23 +03:00
|
|
|
export function calculateAABBCollision(firstObject, secondObject) {
|
2026-07-16 12:37:56 +03:00
|
|
|
try {
|
|
|
|
|
const coordinates = [
|
|
|
|
|
firstObject.left,
|
|
|
|
|
firstObject.right,
|
|
|
|
|
firstObject.top,
|
|
|
|
|
firstObject.bottom,
|
|
|
|
|
secondObject.left,
|
|
|
|
|
secondObject.right,
|
|
|
|
|
secondObject.top,
|
|
|
|
|
secondObject.bottom,
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
if (coordinates.some((element) => typeof element !== 'number')) {
|
|
|
|
|
throw new Error('Координаты должны являться числовыми значениями');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (
|
|
|
|
|
firstObject.left > firstObject.right ||
|
|
|
|
|
firstObject.top > firstObject.bottom ||
|
|
|
|
|
secondObject.left > secondObject.right ||
|
|
|
|
|
secondObject.top > secondObject.bottom
|
|
|
|
|
) {
|
|
|
|
|
throw new Error('Координаты должны быть корректными');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
firstObject.left <= secondObject.right &&
|
|
|
|
|
firstObject.right >= secondObject.left &&
|
|
|
|
|
firstObject.top <= secondObject.bottom &&
|
|
|
|
|
firstObject.bottom >= secondObject.top
|
|
|
|
|
);
|
|
|
|
|
} catch (err) {
|
|
|
|
|
console.error(err);
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|