Recentemente precisei calcular a área de um polígono irregular. Mas como? Fiz uma pesquisa sobre geometria computacional, e uma das formas que encontrei foi em dividir o polígono em vários triângulos e, após isso, calcular a área de cada triângulo. Tudo bem, mas como dividir o polígono em vários triângulos menores? Por exemplo, como dividir automaticamente o polígono da figura 1 em triângulos? Existem algoritmos para isso, para fazer a triangulação de polígonos.

Figura 1 – Um polígono dividido em vários triângulos
Basicamente o algoritmo funciona da seguinte forma. Divide o polígono em vários polígonos monotone* e depois faz a triangulação de cada um desses algoritmos usando um algoritmo para fazer a triangulação.
Essa é uma das formas de se fazer isso. Uma outra forma é baseada na técnica descrita no post “Como calcular computacionalmente o valor de PI“. Nesse caso podemos fazer o seguinte. Desenhamos o polígono em cima de um outro polígono já conhecido, no caso um retângulo. Sabemos como calcular a área do retângulo. Depois disso, começamos a gerar pontos aleatórios dentro do retângulo (o polígono que queremos calcular a área está em cima do retângulo). Para cada ponto, vemos se o ponto caiu dentro do polígono irregular. Se dividirmos a quantidade de pontos que caiu dentro do polígono pela quantidade de pontos gerada, temos a relação entre a área do polígono e a área do retângulo. Como a área do retângulo é conhecida, fica simples calcular a área do polígono, basta fazer uma multiplicação.
No entanto, fica a questão: Como saber se um ponto está dentro do polígono? Para efeitos práticos para o cálculo da área dessa forma, podemos traçar uma semi-reta paralela ao eixo x em direção a +x. Se essa semi-reta interceptar um número ímpar de arestas, podemos dizer que ele está dentro do polígono – Figura 2.
Figura 2 – Ponto dentro e fora do polígono
Agora que sabemos quando um ponto está dentro de um polígono, precisamos saber que essa semi-reta interceptou uma das arestas. Isso pode ser feito da seguinte forma:
Primeiro, calculamos a equação da aresta. Considerando que os vértices da aresta são (x1, y1) e (x2,y2), temos que a equação é:
Aplicando a coordenada y do ponto nessa equação, temos um valor de x. Se esse valor for maior que o valor da coordenada x do ponto, sabemos então que o ponto está a esquerda da aresta.
Além disso, se verificarmos que a coordenada y está entre min(y1,y2) e max(y1,y2), então sabemos que a semi-reta intercepta a aresta.
Com isso já podemos calcular a área de um polígono irregular.
Para ilustrar, segue um código Java para isso.
Classe Ponto

Classe Aresta

Classe Poligono

Como primeiro teste, desenhei um polígono e gerei vários pontos aleatórios para testar se o método para verificar se está dentro do polígono está funcionando. Os pontos verdes estão fora do polígono e os amarelo dentro. Desenhei pequenos círculos em volta do ponto gerado, para aproveitar uma rotina que já tenho aqui. Podemos ver que a rotina se mostra adequada para o problema.

Figura 3 – Teste do método para verificar se pontoe stá dentro do polígono
Resta agora testar se isso funciona para calcular a área. Para isso, vamos criar um quadrado de lado 1 e gerar pontos aleatórios dentro de um quadrado de lado 2 e calcular a relação entre a quantidade de pontos dentro do quadrado e a quantidade de pontos gerada. Esse valor multiplicado pela área do quadrado maior (4), deve dar a área do quadrado, que sabemos que é 1. Na verdade, como esse método não é exato, a área deve ser próxima de 1, e não exatamente 1. Segue trecho de código usado para teste:

Uma das saídas desse programa é mostrada na figura abaixo. Note que o valor da área calculado por esse método é muito próximo ao valor real. Na verdade, podemos aumentar a precisão do algoritmo aumentando o número de pontos gerados.
Figura 4 – Resultado do programa
A Figura 5 mostra uma figura de exemplo para esse teste, com os pontos gerados:

Figura 5 – Exemplo do teste efetuado
* – optei por não fazer a tradução dessa palavra pois não sei como ela é traduzida em geometria computacional.
Tags: geometria computacional, java, matemática, polígono
dezembro 7, 2008 às 5:26 pm
como é difícil calcular a área de um polígono irregular.
parabéns pela idéia brilhante do blog
dezembro 12, 2008 às 3:55 pm
Olá… Gostaria de fazer um calculo para achar o tamanho de uma reta numa forma irregular… tipo
se eu tenho uma letra O em um programa gráfico e quero saber o valor numa reta da letra o inteira… como fazer isso?
dezembro 20, 2008 às 8:54 pm
Se o polígono for 2D e vc tem uma equação analítica que o descreve, você pode aproximar por monte carlo. Para isso vc estima uma região onde todos os pontos do teu polígono vão estar inclusos e sorteira, com distribuição uniforme, vários pares x,y. Resolvendo a equação para cada um dos pares, vc sabe se ele está dentro ou fora do polígono. Some o número de pontos dentro do polígono, faça a razão entre esta soma e o total de pontos e multiplique pela área da tua região total estimada.
O número de pontos sorteados depende da precisão que vc necessita. Normalmente, poucos pontos são suficientes.
janeiro 16, 2009 às 12:33 am
Boa noite!
Eu tenho as dimensões de uma lagoa (73m x 40m x 1,5m), será que tem como calcular a área em metro quadrado?
Abraço e obrigado
fevereiro 13, 2009 às 5:02 pm
Gostaria de dizer que o artigo tá legal mas que caso você tenha um polígono fechado que não se cruza você pode usar uma formulação mais simples.
areatotal=areatotal+((x1*y2)-(x2*y1)), iniciando areatotal com zero e acumulando até o último ponto. Lembro que o último ponto na realidade é o primeiro ponto repetido. Com esta formulação simples você calcula a área total do polígono. Se voce estiver sobre uma imagem digital o resultado será em pixel se precisar da área em metros quadrados basta verificar o tamanho do pixel no terreno e executar a formula abaixo: ÁreaFinal=areatotal*(resolucaopixel^2) (Descricao: a AreaFinal será o resultado da areatotal calculada multiplicada pela resolução do pixel ao quadrado.
Um grande abraço FRATERNO
Dalmar José dos Santos
Engenheiro Cartógrafo
Curitiba/PR
maio 31, 2009 às 1:55 pm
muito complicado a sua forma de calcular
junho 10, 2009 às 10:42 am
como calcular a area de um quadrado?
julho 13, 2009 às 7:07 pm
tenho uma dúvida sobre uma area que medi as seguintes medidas lado direito 6,71m, lado esquerdo 3,85m, 10 de frete e 5,03 de fundo, qual a medida em metros quadrado?
julho 29, 2009 às 1:51 pm
Eu ja consegui obter o valor da area em pixels. mas agora quero transformar em metros quadrados. Tem como eu fazer isso ??
Ou Coisa parecida ?
Muito Obrigado !!
agosto 4, 2009 às 6:40 pm
Dian Carlos Cabral, dá uma olhada aqui: http://pessoal.sercomtel.com.br/matematica/conline/quadconv/quadconv.htm
Dyego, esse método já te dá o resultado na unidade que você tá trabalhando. Veja que no exemplo acima a gente está considerando um quadrado de lado 2 (pode ser 2m, 2cm, 2km) e o resultado é dado em função disso. Se for 2m, o resultado será dado em metros quadrados. Se você estiver pensando em cm, o resultado será dado em cm quadrados.
outubro 13, 2009 às 3:09 pm
Tenho duvida para medir um terreno de 16,80m frante, 26,75m fundos e 50,20m Direito, e 39,90m esquerdo gostaria de saber qual a regra mais simples e correta de calcular. Grato.
Serafim
outubro 13, 2009 às 4:28 pm
http://www.webcalc.com.br/frame.asp?pag=http://www.webcalc.com.br/matematica/quadrilatero.html
dezembro 1, 2009 às 8:48 pm
eu desejo imagens de poligonos e rapidoooooooooooooooooo!!!!!!!!!!!!!!!!!
dezembro 5, 2009 às 3:23 pm
gostaria de calcular a área de um terreno irregular, com as seguintes medidas:
Frente: 8,70 m
Fundo: 14,45 m
Lateral esq.: 24,0 m
Lateral dir.: 27,20 m
Fico no aguardo.
setembro 29, 2010 às 6:06 pm
Olá, este algoritmo foi testado? tentei reproduzi-lo aqui e não funcionou. A saída do programa é: Relação: 0.0 Área: 0.0
setembro 30, 2010 às 5:45 pm
Cládio,
funciona sim. Se você quiser, deixe seu e-mail que eu mando o código.
outubro 15, 2010 às 7:41 pm
kn jjjjjjjjjjjjjj
dezembro 9, 2010 às 11:55 pm
enendi
dezembro 9, 2010 às 11:55 pm
entendi
janeiro 22, 2011 às 1:20 am
GOSTARIA DE SABER A AREA DE UM TERRENO COM AS SEG. MEDIDAS:LADO A =10,00MTS – LADO B = 15,00MTS -LADO C = 13,00MTS – LADO D = 20,00MTS
janeiro 24, 2011 às 12:18 pm
Excelente post, cara.
Preciso calcular o metro quadrada de um polígono irregular.
Eu mesmo imaginei uma forma para resolver o problema e gostaria de saber se irá funcionar.
Meu raciocínio:
Para calcular o metro quadrado eu multiplico comprimento X largura. Ok.
Funciona se eu pegar os N pontos do polígono, multiplicá-los e depois dividir pela número de pontos?
Exemplo:
Lado A = 5m.
Lado B = 3m.
Lado C = 6m.
Lado D = 2m.
Lado E = 8m
Fórmula: (5 X 3 X 6 X 2 X 8) / 5
Seriam 288 metros quadrados!?
Gostaria de saber se funciona este meu raciocínio??
Aguardo ancioso.
janeiro 25, 2011 às 3:51 pm
Rafael, não funciona.
Você propôs uma coisa que deveria funcionar para qualquer polígono. Para ver que não funciona, pense num caso muito simples: Um quadrado de lado 1. A área é desse quadrado é 1m2. De acordo com sua proposta, seria (1x1x1x1)/4 = 0.25.
janeiro 27, 2011 às 11:21 am
Bom, quem disse que ia ser fácil.
Agradeço a ajuda.
Como você já facilitou postando o código, sou grato em copiar e adaptar ao meu contexto.
Valeu.
agosto 24, 2011 às 1:07 am
Muto bom seu artigo.
Já usou a api Polygon (http://download.oracle.com/javase/1.4.2/docs/api/java/awt/Polygon.html), do java funcina da mesmo forma ?
agosto 24, 2011 às 12:36 pm
como eu caulculo a área de uma cruzzzzz eu naum sei como se faz
agosto 24, 2011 às 1:18 pm
Thiagoturim,
Não sei se o Polygon tem um método para calcular a área, mas o método contains poderia ser utilizado para verificar se um ponto está dentro do polígono.
agosto 24, 2011 às 1:33 pm
Vanessa, divida a cruz em retângulos e calcule a área de cada retângulo. Depois some todas as áreas.
agosto 27, 2011 às 7:53 pm
tem como você disponibilizar o código para download ?
agosto 30, 2011 às 6:03 pm
thiagoturim,
deixei seu e-mail que mando o código.
novembro 4, 2011 às 2:12 pm
Olá, demoniodemaxwell.
Realizei minha pesquisa de TCC e achei seu post muito interessante, e gostaria de colocar no referencial teórico.
Somente tem um problema, não posso colocar na bibliografia o nome: demoniodemaxwell.
se pudesse me informar quem realmente escreveu este post. ficaria grato desde ja.
valew.
dezembro 22, 2011 às 5:57 pm
kra alguém disse que essa solução é brilhante! (no primeiro comentário) poderia até ser se a complexidade de um algoritmo fosse uma variável desprezível!!! esse seu algoritmo é péssimo, além de não ser aplicável a situações reais, tipo em um aplicativo SIG.
janeiro 21, 2012 às 8:12 pm
Dividir uma área poligonal fechada em triângulos é facil. Determinar o comprimento de cada lado dos triângulos por medição ou pelo teorema de pitágoras se conhecidas as coordenadas dos marcos do terreno é trabalhoso,mas também é facil. Multiplicando um lado do triângulo pela sua altura e dividindo por dois temos a área de cada triângulo. A dificuldade é saber a altura “h” que com os meus 84 anos foi fácil deduzir.
h é a raiz quadrada de b2-e2 (b ao quadrado menos e ao quad.).
Sendo os catetos a, b, c, e=(c2+b2-a2)/2.c ou ainda:
h=SQR(b^2-((c^2+b^2-a^2)/2*C)^2)
março 4, 2012 às 8:04 pm
gostaria de saber como calcular uma area de um pentagono de lados diferentes.ex: a) 26m b) 28m c)29 d)32 e) 33?