Voltar
Como calcular bounding boxes no tldraw

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

Avalie este artigo:
Categoria
CEVIU Web Dev
Publicado
22 de outubro de 2026
Editoria
CEVIU Web Dev

Quer receber mais sobre CEVIU Web Dev?

Conteúdo curado diariamente, direto no seu e-mail.

Conteúdo curado diariamenteDiversas categoriasCancele quando quiser