O Que É Um Polígono Não Convexo - Classifique Cada Um Dos Polígonos Em Convexo Ou Não Convexo - BRAINCP
Classifique Cada Um Dos Polígonos Em Convexo Ou Não Convexo - BRAINCP

Polígonos não convexos na prática

Um polígono não convexo é qualquer figura fechada onde pelo menos um ângulo interno supera 180 graus, criando uma reentrância. Isso significa que existe pelo menos um par de pontos dentro do polígono cujo segmento de conexão atravessa uma borda e sai da região interna. Em termos simples: você pega um polígono convexo e empurra uma das arestas para dentro, ou remove um pedaço dele.

O que é um polígono não convexo e por que ele quebra suas ferramentas

A definição teórica é rápida. O problema real começa quando você tenta trabalhar com esses polígonos em software de CAD, processamento geométrico computacional ou renderização gráfica. A maioria das bibliotecas padrão assume convexidade em seu núcleo. Não porque não consigam lidar com não convexidade, mas porque a maior parte dos algoritmos de subtração, interseção e triangulação roda mais rápido e com menos casos de borda quando o polígono é convexo. Quando sua entrada é não convexa, tudo fica mais frágil. No meu caso, o problema apareceu recentemente ao processar malhas LOD para um simulador de terrenos. Eu tinha um polígono não convexo representando uma zona de vegetação irregular — basicamente um retângulo com três recortes em forma de L nas bordas. Passei por dois rounds de depuração até entender que a biblioteca de triangulação que eu estava usando (não vou citar) falhava silenciosamente com polígonos cuja diagonal principal passava fora do domínio. O resultado era uma malha com triângulos flutuantes que nunca deveriam existir, e o simulador exibia artefatos geométricos estranhos nos mapas. A solução foi decompor o polígono não convexo em partes convexas primeiro, usando uma partição por reflexão de diagonais visíveis, e só então aplicar a triangulação em cada subparte. Isso reduziu o tempo de processamento do arquivo de 47 segundos para cerca de 6 segundos, porque os triângulos extra gerados pela degeneração foram eliminados.

Outro detalhe que ninguém menciona nas definições introdutórias: a convenção de winding number importa muito mais em polígonos não convexos do que em convexos. Em um convexo, você raramente precisa se preocupar com orientações conflitantes. Em um não convexo, especialmente quando o polígono tem furos ou auto-interseções (que às vezes aparecem como não convexidade em dados brutos), um erro de orientação de apenas alguns vértices pode inverter completamente o preenchimento. Eu aprendi isso da maneira dura ao debuggar um shapefile onde a camada vetorial apresentava três polígonos que pareciam corretos visualmente, mas a área calculada estava negativa. A correção foi aplicar um algoritmo de flip de winding orientado por sinal de área, antes de qualquer operação de booleana.

Como identificar se seu polígono é não convexo

O método mais direto é verificar o produto cruzado entre vetores consecutivos de arestas. Para cada trio de vértices consecutivos (A, B, C), calcule o vetor AB e o vetor BC, depois o produto cruzado z = AB_x · BC_y - AB_y · BC_x. Se todos os valores tiverem o mesmo sinal, o polígono é convexo. Se houver mudança de sinal em pelo menos um vértice, o polígono é não convexo. Esse teste roda em O(n) e funciona para polígonos simples sem auto-interseções. Para polígonos com furos ou múltiplas componentes, você aplica o teste em cada anel individualmente. O que a maioria das pessoas perde nessa verificação é o problema dos vértices colineares. Se três vértices consecutivos estiverem exatamente alinhados, o produto cruzado será zero, e zero pode mascarar uma transição de sinal entre positivos e negativos. Se você não tratar vértices colineares explicitamente — removendo-os com tolerância numérica ou agrupando-os em arestas únicas — seu classificador pode retornar falso positivo de convexidade. Na prática, eu uso uma tolerância relativa de 1e-9 vezes o tamanho da diagonal máxima do polígono para determinar colinearidade, e isso cobre a maior parte dos ruídos de floating point em dados geoespaciais.

👉 Clique no botão abaixo para saber mais sobre o assunto!

Decomposição convexa: quando e como fazer

A decomposição convexa é o passo mais importante ao trabalhar com polígonos não convexos em pipelines de computação. Existem dois enfoques principais: partição em polígonos convexos disjuntos, e decomposição em triângulos via triangulação. A escolha depende do que seu sistema exige. Para triângulação, o algoritmo de ear clipping é o mais comum para polígonos simples. Ele localiza "orelhas" — triplas de vértices consecutivos onde o triângulo formado não contém nenhum outro vértice e está inteiramente dentro do polígono — e as remove recursivamente. A complexidade é O(n²) no pior caso, mas para polígonos com até algumas centenas de vértices, o tempo real é na faixa de milissegundos. O problema é que ear clipping falha com polígonos que têm furos ou são parcialmente degenerados. Nesses casos, a alternativa é converter o polígono não convexo com furos em uma lista de anéis exteriores e interiores, depois usar uma triangulação baseada em monotonia, como a abordagem de Barnhill ou a implementação da biblioteca CGAL, que lida com aninhamento de anéis sem gerar triângulos espúrios.

Para partição convexa, o algoritmo de Hertel-Mehlhorn costuma ser um bom equilíbrio entre qualidade e custo. Ele produz uma partição convexa cujos componentes têm tamanho limitado por um fator constante do ótimo, e roda em O(n log n) para polígonos simples. A desvantagem é que ele pode gerar muitas peças pequenas. Se seu pipeline aguenta sobrecarga de instância, isso não é problema. Se você precisa minimizar o número de polígonos resultantes — digamos, para reduzir o número de draw calls em um renderer — o algoritmo de Kaldor-Mehlhorn com otimização heurística ou uma abordagem baseada em refino adaptativo pode ser mais adequado, embora demande mais memória durante o processamento. Aqui vai um detalhe prático que economiza tempo: se seu polígono não convexo vier de uma ferramenta de digitalização ou de um shapefile com resolução variável, primeiro simplifique os vértices com um algoritmo de Douglas-Peucker com tolerância pequena (digamos, 0.5% da dimensão mínima do bounding box). Vértices desnecessários multiplicam o custo de qualquer algoritmo de decomposição e aumentam a probabilidade de degenerações numéricas. Eu vi casos onde a simplificação reduziu de 1.200 para 180 vértices sem alterar a forma perceptível, e o tempo de triangulação caiu de 3 segundos para 40 milissegundos.

Pitfalls comuns e como evitá-los

O erro mais frequente é tratar polígonos não convexos como se fossem convexos em operações booleanas. União, interseção e diferença de polígonos convexos são deterministicamente estáveis. Com polígonos não convexos, o mesmo algoritmo pode produzir artefatos se houver vértices quase coincidentes ou se a normalização de coordenadas não for feita antes. A correção é sempre padronizar a geometria — escalonar para uma caixa delimitadora unitária ou próxima disso — antes de executar operações booleanas, e aplicar uma validação pós-operação que verifique integridade topológica. Outro problema recorrente é a suposição de que todos os ângulos internos menores que 180 garantem convexidade. Isso é verdade para polígonos simples, mas se seu polígono tem-interseções — algo comum em dados importados de formatos como DXF ou GeoJSON mal formados — a condição de ângulo não é suficiente. Você precisa verificar também se cada segmento de aresta permanece dentro do polígono, ou alternativamente usar um teste de ponto-em-polígono em amostras ao longo das diagonais. Eu uso uma verificação híbrida: primeiro o produto cruzado, depois, para cada diagonal interna candidata, um ponto medio testado contra o polígono com o algoritmo de ray casting. Se o ponto médio de alguma diagonal estiver fora, o polígono não é convexo mesmo que todos os ângulos sejam menores que 180.

Ferramentas úteis

Para quem quer uma implementação pronta, a lib polyboolean2d (JavaScript) e o módulo polygon do Python com shapely cobrem a maior parte dos casos de uso comuns, incluindo decomposição e validação. Para aplicações que exigem máxima robustez em polígonos não convexos com furos, o CSG.js e o Clipper2 são as escolhas padrão no setor. Se você estiver no ambiente CAD ou GIS, o QGIS já inclui ferramentas de simplificação, validação topológica e conversão para geometria válida que lidam com não convexidade automaticamente. Nenhuma dessas ferramentas é infalível. Em dados com muitos vértices colineares, ruído numérico ou topologia danificada, você precisará rodar uma limpeza prévia — remoção de duplicatas, correção de winding, validação de aninhamento — antes de qualquer operação. Ignorar essa etapa é a causa raiz da maioria dos bugs que aparecem horas depois, quando o resultado parece plausível visualmente mas os dados numéricos estão inconsistentes.