Bounding box (bbox) — это минимальный прямоугольник, полностью охватывающий элемент SVG. В библиотеке SVG.js bbox играет ключевую роль для вычисления размеров, расположения и позиционирования графических объектов.
bbox()В SVG.js любой элемент имеет метод bbox(), который
возвращает объект с координатами и размерами:
let rect = draw.rect(100, 50).move(10, 20);
let box = rect.bbox();
console.log(box);
Возвращаемый объект имеет следующую структуру:
{
x: 10, // координата x верхнего левого угла
y: 20, // координата y верхнего левого угла
width: 100, // ширина элемента
height: 50 // высота элемента
}
Важно: bbox() учитывает текущие
трансформации элемента, такие как rotate,
scale и translate.
Полученный bbox позволяет точно позиционировать элементы относительно других объектов:
let circle = draw.circle(40).move(50, 50);
let rect = draw.rect(60, 30).move(circle.bbox().x + circle.bbox().width + 10, circle.bbox().y);
В этом примере прямоугольник размещается справа от круга с отступом в 10 единиц.
rbox()SVG.js также предоставляет метод rbox(), возвращающий
bounding box с учётом всех родительских
трансформаций:
let group = draw.group().move(100, 100);
let rect = group.rect(50, 30);
console.log(rect.bbox()); // координаты относительно элемента
console.log(rect.rbox()); // координаты относительно корня SVG
bbox() — локальные координаты элемента.rbox() — глобальные координаты элемента в контексте
всего SVG.Для групп и сложных контейнеров bbox() возвращает
прямоугольник, охватывающий все дочерние элементы:
let group = draw.group();
group.rect(50, 50).move(0, 0);
group.circle(30).move(40, 20);
console.log(group.bbox());
// x = 0, y = 0, width = 70, height = 50
bbox() автоматически учитывает смещения и размеры всех
дочерних объектов, формируя минимальный охватывающий прямоугольник.
Трансформации элементов влияют на возвращаемый объект bbox:
let rect = draw.rect(100, 50).move(10, 20).rotate(45, 10, 20);
console.log(rect.bbox());
В этом случае координаты и размеры отражают прямоугольник после
поворота вокруг указанной точки (10, 20).
Метод bbox() широко применяется для анимации элементов,
например, чтобы центрировать объект относительно другого:
let rect = draw.rect(100, 50);
let circle = draw.circle(50);
circle.animate(1000).during(function(pos) {
let box = rect.bbox();
this.center(box.cx, box.cy);
});
В объекте bbox можно получить дополнительные свойства центра:
let box = rect.bbox();
console.log(box.cx, box.cy); // координаты центра прямоугольника
cx = x + width / 2cy = y + height / 2Это упрощает позиционирование и выравнивание элементов.
bbox() вычисляется динамически, поэтому для больших
сцен с множеством элементов частые вызовы могут снижать
производительность.let rectBox = rect.bbox();
let circleBox = circle.bbox();
if (rectBox.width > circleBox.width) {
console.log('Прямоугольник шире круга');
}
let rect1 = draw.rect(80, 40);
let rect2 = draw.rect(60, 30);
let box1 = rect1.bbox();
rect2.move(box1.x + box1.width / 2 - rect2.bbox().width / 2, box1.y);
rect.scale(2);
let updatedBox = rect.bbox(); // размеры изменились
Bounding box в SVG.js — универсальный инструмент для анализа
размеров, позиции и взаимодействия элементов. Он позволяет работать как
с простыми фигурами, так и с группами, учитывая трансформации и иерархию
SVG. Использование bbox() и rbox()
обеспечивает точное позиционирование, выравнивание и создание
динамических визуальных эффектов.