Teste de convexidade de polígono
O retângulo (0, 0), (4, 0), (4, 3), (0, 3) é convexo: todos os cantos viram para o mesmo lado, em sentido anti-horário. A ponta de flecha (0, 0), (3, 1), (0, 2), (1, 1) mistura curvas à esquerda e à direita, então é côncava. Grátis no seu navegador.
- Grátis
- Funciona no seu navegador
- Sem cadastro
- Seus dados não saem do seu aparelho
Executar grátis
Um teste de convexidade de polígono responde a uma pergunta fundamental da geometria computacional: dado um anel ordenado de vértices cartesianos, cada ângulo interior permanece no máximo em cento e oitenta graus de modo que a forma nunca se afunde para dentro? Agrimensores que validam parcelas cadastrais, desenvolvedores de jogos que definem cascos de colisão, equipes GIS que limpam polígonos de geocerca, exportadores CAD que impõem restrições de convexidade e ferramentas de sala de aula que avaliam exercícios de polígonos simples precisam de uma resposta determinística de sim ou não sem montar uma biblioteca geométrica completa. Esta capacidade aceita uma lista ordenada de vértices, percorre o anel fechado uma vez e compara o produto vetorial bidimensional de cada par de arestas consecutivas. Quando todo produto vetorial não nulo compartilha o mesmo sinal, cada virada segue o mesmo sentido e o polígono é convexo; sinais mistos indicam pelo menos um ângulo reflexo e o polígono é côncavo. Produtos vetoriais nulos marcam vértices colineares e são permitidos sem quebrar a convexidade.
Como produtos vetoriais de arestas consecutivas decidem a convexidade
Rotule os vértices ordenados V zero até V n menos um e feche o anel tratando a aresta do último vértice de volta ao primeiro como presente mesmo quando quem chama não repete o ponto inicial. Em cada vértice B com vértice anterior A e seguinte C, forme os vetores de saída de A para B e de B para C. O produto vetorial bidimensional deles é o escalar z igual a (B.x menos A.x) vezes (C.y menos B.y) menos (B.y menos A.y) vezes (C.x menos B.x).
O sinal de z é a direção da virada em B: positivo para uma virada à esquerda quando o plano se orienta com y para cima e x à direita (percurso anti-horário do contorno), negativo para uma virada à direita (percurso horário) e zero quando A, B e C são colineares.
Um polígono simples é convexo se e somente se toda virada não nula compartilha o mesmo sinal, o que significa que cada ângulo interior é no máximo cento e oitenta graus e o contorno nunca inverte o sentido de rotação. Viradas positivas e negativas misturadas provam um ângulo interior reflexo em algum ponto do anel, de modo que o polígono é côncavo.
O algoritmo é estritamente O(n) no número de vértices após um único passo de normalização que remove um duplicado final do primeiro ponto quando quem chama já fechou o anel.
Quando vale testar a convexidade
Pipelines de mapeamento e GIS usam um teste de convexidade de polígono antes de algoritmos que assumem entrada convexa — recorte contra uma janela convexa, decomposição de regiões complexas ou alimentadores de solvers que rejeitam vértices reflexos. Motores de jogos e simulação validam malhas de colisão definidas por designers para que um único afundamento não quebre depois hipóteses de eixos de separação ou GJK. Exportadores CAD e de fabricação impõem restrições de convexidade em blanks e polígonos de suporte antes de enviar geometria a um cortador.
Plataformas educacionais avaliam itens «este polígono é convexo?» com um oráculo determinístico que trata de forma coerente vértices colineares no meio da aresta em vez de confiar no olho. A validação falha não consome saldo.
Casos de uso
Validação de geocercas e parcelas GIS
Rejeite ou sinalize anéis cadastrais e de geocerca côncavos antes de pipelines que assumem polígonos convexos para recorte, buffer ou rotinas de área.
Checagens de casco de colisão em jogos
Valide polígonos de colisão 2D definidos por designers para que algoritmos dependentes de convexidade nunca recebam um casco amassado em tempo de execução.
Correção automática em sala e exames
Avalie itens «este polígono é convexo?» com um oráculo determinístico de produto vetorial alinhado às definições de direção de virada do livro didático.
Perguntas frequentes
Como você testa se um polígono é convexo?
Envie vértices ordenados como pares {x, y} ou [x, y] (pelo menos três).
E se alguns vértices consecutivos forem colineares?
Produtos vetoriais nulos são permitidos. Pontos colineares no meio da aresta não quebram a convexidade por si sós; apenas viradas mistas à esquerda e à direita marcam um polígono côncavo.
A ordem dos vértices (horário vs anti-horário) importa?
Qualquer orientação consistente é válida. A resposta reporta orientation como clockwise ou counterclockwise quando convexo, e mixed quando as viradas discordam.
O que acontece com menos de três vértices?
Um teste de convexidade de polígono precisa de pelo menos três vértices; entrada inválida não é cobrada.
O que o resultado informa além do sim ou não?
Ele mostra o sentido de giro do anel: anti-horário, horário, misto em uma figura côncava ou alinhado quando todos os pontos estão sobre uma reta. Também conta as curvas reais e os vértices em que o contorno segue reto.
Ferramentas relacionadas
Para desenvolvedores — acesso via API
Tudo nesta página está disponível via API. Esta seção é para equipes que querem integrar a ferramenta aos próprios sistemas; quem não precisa disso pode simplesmente usar a ferramenta acima.
Endpoint
Autenticação por token Bearer. Um único POST coloca a tarefa na fila; o resultado chega por webhook ou link assinado.
Chame do seu código
curl -X POST https://api.kit.forhosting.com/geo/polygon-is-convex \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"vertices":[{"x":0,"y":0},{"x":4,"y":0},{"x":4,"y":3},{"x":0,"y":3}]}'const res = await fetch("https://api.kit.forhosting.com/geo/polygon-is-convex", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"vertices": [
{
"x": 0,
"y": 0
},
{
"x": 4,
"y": 0
},
{
"x": 4,
"y": 3
},
{
"x": 0,
"y": 3
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/geo/polygon-is-convex",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"vertices": [
{
"x": 0,
"y": 0
},
{
"x": 4,
"y": 0
},
{
"x": 4,
"y": 3
},
{
"x": 0,
"y": 3
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/geo/polygon-is-convex", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"vertices":[{"x":0,"y":0},{"x":4,"y":0},{"x":4,"y":3},{"x":0,"y":3}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"vertices":[{"x":0,"y":0},{"x":4,"y":0},{"x":4,"y":3},{"x":0,"y":3}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/geo/polygon-is-convex", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemplo de requisição
{
"vertices": [
{
"x": 0,
"y": 0
},
{
"x": 4,
"y": 0
},
{
"x": 4,
"y": 3
},
{
"x": 0,
"y": 3
}
]
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "geo.polygon_is_convex",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}A API é assíncrona: cada chamada devolve um task_id na hora. Se preferir polling, consulte o status a até 1 requisição por segundo.
Preço
Preço publicado, sem tokens nem créditos escondidos. Tarefa que falha não é cobrada.
Erros
| HTTP | Código | O que significa |
|---|---|---|
401 | unauthorized | Token ausente ou inválido. Confira o header Authorization. |
402 | insufficient_balance | Saldo insuficiente para esta tarefa. Faça uma recarga e tente de novo. |
404 | unknown_type | Esse tipo de tarefa não existe. Confira o campo type no catálogo. |
429 | rate_limited | Muitas requisições em pouco tempo. Espere um instante e tente de novo. |
Notas técnicas
Como produtos vetoriais de arestas consecutivas decidem a convexidade
Quando todo produto vetorial é zero os vértices estão em uma única reta; a forma não tem área e este endpoint reporta is_convex false com orientation collinear em vez de inventar um casco convexo.
Contrato de entrada, formato da resposta e comportamento de erro
Um vértice final idêntico ao primeiro é removido automaticamente, de modo que anéis fechados no estilo GeoJSON e listas abertas de sala de aula funcionam. Exemplo: o quadrado (0,0), (4,0), (4,3), (0,3) é convexo com orientação anti-horária. Envie por POST um corpo JSON com um campo obrigatório: vertices, um arranjo ordenado de pelo menos três pontos. Cada ponto pode ser um objeto com x e y finitos (ou aliases lon e lat) ou um arranjo de dois elementos [x, y]. Os aliases points, polygon e coords são aceitos com o mesmo significado para que cargas GIS existentes entrem sem renomear. Menos de três vértices após essa normalização, cargas que não são arranjos, coordenadas ausentes e números não finitos falham com invalid_input e não são cobrados. Em caso de sucesso o corpo inclui is_convex como booleano; n como a contagem normalizada de vértices; orientation como counterclockwise, clockwise, mixed ou collinear; turn_count como o número de viradas não nulas; zero_turns como a contagem colinear; uma string formula que reexpressa a identidade do produto vetorial; e vertices ecoados como objetos {x, y} na ordem do anel. O dardo côncavo (0,0), (3,1), (0,2), (1,1) mistura sinais de virada e devolve is_convex false. Combine o booleano com o seu próprio código de desenho se precisar de um esboço; este endpoint apenas classifica convexidade e não emite gráficos, cascos nem triangulação.
Onde uma API de convexidade de polígono gera valor real
Mantenha anéis modestos, fixe is_convex e orientation nos testes e você obtém rótulos de convexidade reproduzíveis para geocercas, checagens de sala de aula e workers na borda sem enviar uma pilha completa de geometria computacional própria.
Perguntas técnicas
Quanto custa o teste de convexidade de polígono?
A ferramenta no navegador é gratuita. Solicitações API usam saldo pré-pago KIT a US$ 0,002 por chamada bem-sucedida; entrada inválida não é cobrada.