Como o tldraw calcula bounding boxes de forma rápida
Aprofundamento CEVIU
Aprofundamento
O texto do blog do tldraw parte de uma pergunta simples: como responder rápido a consultas espaciais num canvas infinito (o que foi clicado, o que está visível, qual área cerca uma seleção). A resposta são bounding boxes alinhadas aos eixos (AABB). Como as bordas ficam sempre horizontais e verticais, checar sobreposição de duas caixas exige só quatro comparações entre bordas, sem projeções com produto escalar (o teorema do eixo separador, que seria mais caro).
Para shapes rotacionadas, o tldraw pega os vértices da bounding box da shape no sistema de coordenadas local, transforma para o espaço da página e usa Box.FromPoints para achar os valores mínimo e máximo de x e y. No exemplo do texto, um retângulo de 100×50px rotacionado 45° gera uma caixa de cerca de 106×106px. Com shapes dentro de frames rotacionados, cada transform (posição, rotação, escala) vira uma matriz, e a transform de página é composta recursivamente subindo pelos pais. Para a seleção, o tldraw usa dois tipos de bounds: AABB para viewport culling e uma caixa rotacionada na UI, que permite redimensionar ao longo da orientação real. Se as shapes têm rotações diferentes, cai para a caixa alinhada aos eixos. A caixa rotacionada é calculada desfazendo a rotação dos pontos, achando a AABB nesse espaço e rotacionando a posição de volta.
Toda AABB é aproximação, e o próprio texto admite o custo: às vezes checa-se uma shape que não foi clicada ou renderiza-se uma que mal aparece na borda. Esses falsos positivos são filtrados numa segunda passada, com geometria exata, reservada a casos como hit-testing de perto.
Por que isso importa
Para quem mexe com canvas, editores gráficos ou qualquer UI com muitos elementos, a leitura prática é: use um filtro barato e aproximado primeiro, e deixe a matemática exata para os poucos candidatos que sobrarem. Aceitar falsos positivos baratos costuma render mais do que perseguir precisão em toda consulta.
Perguntas frequentes
O que é uma bounding box alinhada aos eixos (AABB)?
É o menor retângulo que contém uma shape, com bordas sempre horizontais e verticais em relação ao canvas, mesmo que a shape esteja rotacionada. Isso permite testar sobreposição com apenas quatro comparações entre as bordas de duas caixas.
Como o tldraw calcula a bounding box de uma shape rotacionada?
Ele transforma os vértices da caixa da shape para coordenadas da página e usa Box.FromPoints para achar os valores mínimo e máximo de x e y. O resultado é a menor caixa alinhada aos eixos que envolve os pontos rotacionados. No exemplo de 100×50px girado 45°, a caixa fica com cerca de 106×106px.
Como o tldraw lida com shapes dentro de frames rotacionados?
Cada transform é uma matriz. A transform de página da shape é a composição da transform de página do pai com a transform local dela, de forma recursiva. Se a shape está direto na página, a transform de página é só a local.
Por que a seleção rotacionada não usa só AABB?
Porque uma caixa alinhada aos eixos só deixaria redimensionar na horizontal e na vertical da página, distorcendo shapes rotacionadas. O tldraw usa AABB para viewport culling e uma caixa rotacionada na UI de seleção. Se as shapes têm ângulos diferentes, volta para a AABB.
Fontes
- tldraw.devfonte original
- Categoria
- CEVIU Web Dev
- Publicado
- 22 de outubro de 2026
- Editoria
- CEVIU Web Dev

