Como calcular a área de um polígono irregular

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.

triangulacao

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.

dentroforaFigura 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 é:

x = x1 + (y-y1)\frac{(x2-x1)}{(y2-y1)}

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-ponto

Classe Aresta

classe-aresta

Classe Poligono

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.

teste-ponto-esta-dentro-do-poligono

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:

teste-calculo-da-area

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.

saida-do-programaFigura 4 – Resultado do programa

A Figura 5 mostra uma figura de exemplo para esse teste, com os pontos gerados:

exemplo-de-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.

Anúncios

Tags: , , ,

39 Respostas to “Como calcular a área de um polígono irregular”

  1. Daniana de Oliveira Silva Says:

    como é difícil calcular a área de um polígono irregular.
    parabéns pela idéia brilhante do blog

  2. Ilamar Says:

    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?

  3. Vitor Fernando Pamplona Says:

    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.

  4. Breno Says:

    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

  5. Formulação simples para cálculo de Área de Polígono Says:

    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

  6. miriam Says:

    muito complicado a sua forma de calcular

  7. paulo Says:

    como calcular a area de um quadrado?

  8. Diancarlos Cabral Says:

    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?

  9. Dyego Says:

    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 !!

  10. demoniodemaxwell Says:

    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.

  11. ELSON ROSA SERAFIM Says:

    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

  12. demoniodemaxwell Says:

    http://www.webcalc.com.br/frame.asp?pag=http://www.webcalc.com.br/matematica/quadrilatero.html

  13. rafael Says:

    eu desejo imagens de poligonos e rapidoooooooooooooooooo!!!!!!!!!!!!!!!!!

  14. gustavo Says:

    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.

  15. Cládio Says:

    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

  16. demoniodemaxwell Says:

    Cládio,

    funciona sim. Se você quiser, deixe seu e-mail que eu mando o código.

  17. jnkkk Says:

    kn jjjjjjjjjjjjjj

  18. karina Says:

    enendi

  19. karina Says:

    entendi

  20. WALMIR CERQUEIRA Says:

    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

  21. Rafael Says:

    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.

  22. demoniodemaxwell Says:

    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.

  23. Rafael Says:

    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.

  24. thiagoturim Says:

    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 ?

  25. vanessa nicholle Says:

    como eu caulculo a área de uma cruzzzzz eu naum sei como se faz

  26. demoniodemaxwell Says:

    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.

  27. demoniodemaxwell Says:

    Vanessa, divida a cruz em retângulos e calcule a área de cada retângulo. Depois some todas as áreas.

  28. thiagoturim Says:

    tem como você disponibilizar o código para download ?

  29. demoniodemaxwell Says:

    thiagoturim,

    deixei seu e-mail que mando o código.

  30. Márcio José Mantau Says:

    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.

  31. estudante Says:

    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.

  32. Orlando Pedro Says:

    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)

  33. paulo weverton Says:

    gostaria de saber como calcular uma area de um pentagono de lados diferentes.ex: a) 26m b) 28m c)29 d)32 e) 33?

  34. Anónimo Says:

    I don´t like, I found a little confusing, meaningless, I think that would have more information

  35. hhhg Says:

    what mano que q isso entendi nada

  36. tony chagas Says:

    um polígono irregular com cinco lados. o lote tem as seguintes dimensões 13m frente, 22m lateral direita, 21m fundos, 4m um beco, 32m de lateral esquerda. qual o calculo para atingir a metragem quadrada total e qual seria a metragem?

  37. Arthur Souza Says:

    Você ainda visita o blog? Tem como passar o código? Reproduzi aqui mas a saída de Área e Relação ficam em 0.

  38. demoniodemaxwell Says:

    Arthur,

    Se você copiou o código corretamente, a saída deveria ser a do print. Pra variável relacaoEntreAreas estar dando 0, talvez você tenha esquecido a multiplicação pelo double (1.0) na definição. Se tiver sido isso, ele vai converter para int e a saída será zero mesmo.

    Embora não tenha mais esses exemplos, copiei para o ideone e rodei de novo. Segue o código (você pode consultar também por aqui, mas não sei quanto tempo eles deixam no ar: https://ideone.com/HabvOC):

    import java.util.*;
    import java.lang.*;
    import java.io.*;

    class Ponto {
    public double x, y;
    public Ponto(double x, double y) {
    this.x = x;
    this.y = y;
    }
    }

    class Aresta {
    private Ponto inicio, fim;
    public Aresta(Ponto i, Ponto f) {
    inicio = i;
    fim = f;
    }
    public Ponto getInicio() {
    if (inicio == null)
    inicio = new Ponto(0,0);
    return inicio;
    }
    public Ponto getFim() {
    if (fim == null)
    fim = new Ponto(0,0);
    return fim;
    }
    public void setInicio(Ponto i) {
    this.inicio = i;
    }
    public void setFim(Ponto f) {
    this.fim = f;
    }
    public boolean verificaSePtoInterceptaArestaPelaDireita(Ponto p) {
    Ponto p1 = getInicio();
    Ponto p2 = getFim();

    double ymin = Math.min(p1.y, p2.y);
    double ymax = Math.max(p1.y, p2.y);

    double y = p.y;
    double x = p1.x + (y-p1.y)*(p2.x-p1.x)/(p2.y-p1.y);

    boolean estaAEsquerda = p.x = ymin && y <= ymax;
    return estaAEsquerda && interceptaSegmento;
    }
    }

    class Poligono {
    public List arestas;

    public Poligono(List a) {
    setArestas(a);
    }
    public List getArestas() {
    if (arestas == null) {
    arestas = new ArrayList();
    }
    return arestas;
    }
    public void setArestas(List arestas) {
    this.arestas = arestas;
    }

    public boolean isDentroDoPoligono(Ponto p) {
    int numeroDeArestasInterceptadas = 0;
    Iterator i = getArestas().iterator();
    while (i.hasNext()) {
    if (i.next().verificaSePtoInterceptaArestaPelaDireita(p)) {
    numeroDeArestasInterceptadas++;
    }
    }

    return numeroDeArestasInterceptadas % 2 == 1;
    }
    }

    class Teste {
    public static void main(String args[]) {
    Aresta a1 = new Aresta(new Ponto(0,0), new Ponto(0,1));
    Aresta a2 = new Aresta(new Ponto(0,1), new Ponto(1,1));
    Aresta a3 = new Aresta(new Ponto(1,1), new Ponto(1,0));
    Aresta a4 = new Aresta(new Ponto(1,0), new Ponto(0,0));

    List arestas = new ArrayList();
    arestas.add(a1);
    arestas.add(a2);
    arestas.add(a3);
    arestas.add(a4);

    Poligono p = new Poligono(arestas);

    int pontosDentro = 0;
    int totalDePontos = 1000000;

    double ladoQuadrado = 2;
    for (int i = 0; i < totalDePontos; i++) {
    Ponto ponto = new Ponto(Math.random()*ladoQuadrado, Math.random()*ladoQuadrado);
    if (p.isDentroDoPoligono(ponto))
    pontosDentro++;
    }
    double relacaoEntreAreas = (1.0*pontosDentro/totalDePontos);
    System.out.println("Relação: " + relacaoEntreAreas);
    }
    }

  39. Arthur Souza Says:

    Obrigado por responder, estudei seu código e ajudou bastante. Tenho um problema aqui. Dado um polígono irregular qualquer, preciso dividi-lo em n partes iguais e retornar com os pares (x,y) de cada nova parte. Você sabe alguma bibliografia que possa me indicar? Desde já, muito obrigado

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s


%d blogueiros gostam disto: