You are on page 1of 9

Area de un polgono irregular: producto en cruz

Hace algn tiempo, le en un foro una discusin acerca de cmo calcular el rea de un polgono irregular no necesariamente convexo. Por supuesto, todos los contertulios cayeron en la cuenta de que el rea de del polgono deba calcularse por triangulacin. Es decir, dividiendo el polgono en tringulos, calculando el rea de cada tringulo y luego sumando todas las reas. Me llamaron tanto la atencin las complicadas soluciones que se propusieron que me puse inmediatamente a buscar por internet para ver si encontraba alguna buena pgina acerca de ello. Como no la encontr, me anim a escribir este artculo, describiendo un algoritmo que me comentaron hace ya muchos aos, pero que recuerdo especialmente por ser uno de los ms ingeniosos que conozco. Intentar contarlo lo mejor que pueda. Es evidente que el mtodo para hallar este rea de un polgono irregular debe diferir mucho de la que se utiliza para los polgonos regulares. Para calcular el rea de un polgono regular, basta conocer un par de parmetros sobre ellos (por ejemplo, el nmero de lados y la longitud de uno de ellos) y aplicar una de las conocidas frmulas que aprendimos en el cole. Sin embargo, las aplicaciones del mundo real que trabajan con polgonos, suelen hacerlo sobre polgonos irregulares, de ah su importancia. Bien el caso es que si contamos con un polgono irregular cualquiera. Por ejemplo, ste...

Si estamos resolviendo el problema con lpiz y regla la solucin es sencilla. Cogemos el polgono y lo dividimos arbitrariamente en una serie de tringulos. Da igual qu tringulos escojamos mientras al final slo queden tringulos.

Por ejemplo, as Ahora cogemos una escuadra y una regla y vamos tringulo por tringulo midiendo su base y su altura y aplicamos esa frmula que resuena en nuestra memoria como el tintineo de un martillo sobre un yunque: Area del tringulo igual a base por altura partido por dos. Fantstico una vez hallado el rea de cada tringulo, sumamos todas las reas y tenemos la del polgono entero.

El problema es que en las aplicaciones computacionales, los polgonos no estn dibujados, as que no podemos sacar la regla para medir. Debemos recurrir a mtodos computacionales. En primer lugar, es necesario decir que los polgonos suelen definirse por las coordenadas en el plano de los puntos que conforman sus vrtices. Uniendo cada punto con el siguiente y el ltimo con el primero obtendremos una lnea cerrada (una serie de segmentos, hablando con ms propiedad) que conforma el polgono. Esa lnea cerrada encierra una superficie plana que podemos medir. El resultado de esa medida ser la extensin del rea. Empecemos por el principio vamos a ver cmo calcular el rea de un tringulo si tenemos las coordenadas de sus vrtices, y luego veremos cmo utilizar ese mtodo para hallar la de un polgono irregular.

rea de un tringulo
Tomemos un tringulo cualquiera en un plano Por ejemplo. ste tringulo para manejarlo computacionalmente, lo ms frecuente es que almacenemos las coordenadas de sus vrtices con respecto a algn sistema de referencia (los ejes que escojamos).

alt A la vista de las coordenadas de sus vrtices, est claro que si queremos aplicar la frmula de base por altura partido por dos, lo tenemos complicado. En el foro que comentaba anteriormente, alguien propuso escoger un lado y trabajar con los ngulos que formaban los otros dos para hallar la altura a travs de trigonometra Nadie puede decir que el planteamiento fuera incorrecto pero existen mtodos mucho ms sencillos para calcular el rea de un tringulo sin recurrir a trigonometra. En el caso de que tengamos las coordenadas de sus vrtices (como ste), vamos a llamarlas (x1, y1), (x2, y2) y (x3,y3) basta con colocarlas en una matriz cuadrada de 3 por 3 de sta manera:

En la tercera fila, colocamos, a pin, el valor . Pues bien si hacemos el determinante de M y tomamos valor absoluto, sale el rea del tringulo. Parece magia Verdad?... y nada de trigonometra. Si recuerdas la regla de Sarrus para los determinantes de 3 por 3, el resultado sera:

det(M)=x1y2 + x2y3 + x3y1 - y1x2 - y2x3 - y3x1 Hmmm El est pidiendo a gritos que lo saquemos como factor comn. det(M)=(x1y2 + x2y3 + x3y1 - y1x2 - y2x3 - y3x1) Ya est. Finalmente, si el determinante sale negativo, tomamos valor absoluto y ese valor es el rea del tringulo. Vamos a probar con nuestro tringulo del principio el que tena de coordenadas de sus vrtices los puntos (2,3), (7,1), y (5,7)

Al hacer el determinante nos da 13. Ese es el rea del tringulo en unidades al cuadrado. Es casi magia casi. (Me temo que tiene ms que ver con el producto escalar de vectores que con la magia) Vamos a comentar una curiosa propiedad de sta forma de calcular el rea de un tringulo y que tiene que ver con el signo del determinante. Al colocar las coordenadas de los vrtices en la matriz yo no he utilizado un orden concreto. Sin embargo, el determinante se comporta de forma distinta segn se coloquen los puntos en la matriz: Si utilizo (2,3), (7,1) y (5,7), como en este caso el resultado es positivo. Si utilizo (7,1), (5,7) y (2,3) tambin sale positivo, al igual que con (5,7), (2,3) y (7,1). Sin embargo, si utilizo cualquiera de las tres combinaciones anteriores pero con los puntos ordenados al revs (7,1), (2,3) y (5,7), o (5,7),(7,1) y (2,3) o (2,3),(5,7) y (7,1) el resultado es negativo, es decir, -13. El caso es que cuando se ordenan los puntos escogindolos en sentido antihorario (al revs de cmo van las agujas de un reloj) el resultado sale positivo, independientemente de por qu punto se empiece. Pero si escojo los puntos en sentido horario (siguiendo el movimiento de las agujas de un reloj), el resultado es el mismo en valor absoluto, pero tiene signo negativo. Curioso Verdad? En el caso de un tringulo, esta propiedad no tiene la mayor importancia despreciamos el signo y ya est... pero va a ser de mucha importancia para obtener el rea de un polgono de ms de tres lados.

Clculo del rea de un polgno irregular cualquiera


Bueno parece que lo ms evidente una vez llegados aqu y conociendo una forma de hallar el rea de un tringulo, ya podemos ponernos a calcular la de un polgono. Parece evidente que ya podemos dividir nuestro polgono en tringulos y calcular el rea de cada uno de ellos. Realmente, si cogemos lpiz y regla nos daremos cuenta de que hay muchas formas de triangular un polgono. Existen muchos algoritmos de triangulacin (el de Delaunay, el de cortar orejas, tambin conocido como algoritmo de Van Gogh), cada uno de ellos con un propsito concreto. Probablemente, el ms sencillo de ellos sea el de cortar orejas. Pero para calcular el rea, no ser necesario utilizar ninguno de ellos. Vamos a utilizar un mtodo todava menos costoso computacionalmente hablando. Volvamos a nuestro polgono del principio. En lugar de triangular arbitrariamente, vamos a aplicar otro sistema:

Escogemos uno de los vrtices (uno cualquiera, el que mejor nos venga), y a ese lo vamos a llamar vrtice 1. Luego, siguiendo un sentido antihorario, numeramos los dems 2, 3, 4 los que sean.

A continuacin, iremos formando todos los posibles tringulos que tengan en comn al vrtice 1. Dicho de otra manera: El tringulo formado por 1,2,3, luego 1,3,4, luego 1,4, 5, luego 1,5,6 y as hasta el ltimo.

De cada uno de ellos calcularemos el determinante como hemos visto en el apartado anterior, y la suma de todos los resultados ser el rea del polgono.

La explicacin es que al formar los tringulos, en el orden escogido de vrtices, algunos tringulos los recorremos en sentido horario y otros en sentido antihorario. Los tringulos que recorremos en sentido antihorario contribuyen a aumentar el area, el resultado del determinante es positivo, y los que recorremos en sentido horario contribuyen a eliminar los trozos que quedan fuera del polgono. Observa esta animacin, que seguro que resulta ms clarificadora.

Cabe comentar que el algoritmo tambin puede aplicarse si en lugar de recorrer los vrtices en sentido antihorario lo hacemos en el contrario. La diferencia es que el resultado final saldr negativo. (Los tringulos azules contribuyen a calcular el area y los rojos a eliminar lo que queda fuera del polgono). As pues, no es necesario comprobar el sentido de los vrtices en el plano. Aplicamos el algoritmo sumando el resultado de los determinantes, y finalmente tomamos el valor absoluto de la suma. Ingenioso Verdad? No slo es ingenioso, sino que tiene una complejidad bastante baja, lineal, del rden de n, siendo n el nmero de vrtices del polgono (O(n)). Pero eso no es todo este algoritmo an se puede afinar ms.

Optimizacin
Si desarrollamos la suma de determinantes, nos daremos cuenta de que hay trminos que en un determinante aparecen sumando y en otro restando. (Cada determinante tiene tres trminos que suman y tres que restan). Por ejemplo, si los vrtices del polgono estn en las coordenadas (x1,y1), (x2,y2), (x3,y3), (x4,y4) (xn, yn) El primer determinante es x1y2 + x2y3 + x3y1 - y1x2 - y2x3 - y3x1 y el segundo es

x1y3 + x3y4 + x4y1 - y1x3 - y2x4 - y4x1 Los trminos subrayados se pueden eliminar, ya que en uno aparecen sumando y en otro restando (aunque estn escritos en otro orden, fjate en que multiplicandos de cada trmino son los msmos). Cuando hacemos esto para todos los determinantes, resulta que podemos eliminar un montn de trminos, y adems, por supuesto, sacar como factor comn el . Si eliminamos todos esos trminos que se anulan, el resultado de la suma de los determinantes es x1y2-y1x2+ x2y3-y2x3+ x3y4-y3x4+ xny1-ynx1 Todo ello multiplicado por . Se le llama a menudo "producto en cruz, por la forma que tiene si representamos los trminos de esta manera. En ste grfico, representamos las coordenadas de los vrtices que forman un trmino. Las que estn unidas por una lnea roja son trminos que suman, y las que estn unidas por una lnea azul son trminos que restan (sin olvidarnos del que lo multiplica todo).

As pues, y despus de todo este rollo, el algoritmo para calcular el rea de un polgono P conociendo las coordenadas de sus vrtices ordenados en sentido horario o antihorario y expresadas como (x1,y1), (x2,y2) (xn, yn) es

Ingeniossimo Verdad? Bueno... con esta ltima frmula, ya tenemos bien sencillo utilizarla en cualquier programa. Por ejemplo, observa cmo la hemos utilizado en esta clase Poligono, programada en C#. Bsicamente, sta clase contiene una lista de puntos ordenada. Cada punto representa a un vrtice del polgono. Por supuesto, este ejemplo no es plenamente funcional, slo es una mini demostracin de cmo implementar el algoritmo descrito en ste artculo, pero puede servir de punto de partida para que lo adaptes a tus necesidades.
C# - Clases para representar un punto y un polgono

class Punto { public double x, y; public Punto(double x, double y

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47

48 class Punto { public double x, y; public Punto(double x, double y) { this.x=x; this.y=y; } } //Punto //------------class Poligono { //lista de vrtices //Suponemos que siguen sentido horario o //antihorario y que ningn segmento cruza a //otro. Cada vrtice aparece una sola vez //en la lista. El ltimo se une al primero List<punto> vertices = new List<punto>(); public void nuevoVertice(Punto p) { vertices.Add(p); } public double area() { double suma=0; int i; //Slo calculamos si el polgono tiene //al menos tres vrtices if (vertices.Count>=3) { //producto en cruz desde 1 hasta n-1 for(i=0;i<vertices.Count-1;i++) { suma+=vertices[i].x*vertices[i+1].yvertices[i].y*vertices[i+1].x; }//for //ahora el ltimo con el primero i=vertices.Count-1; suma+=vertices[i].x*vertices[0].yvertices[i].y*vertices[0].x; }//if return Math.Abs(suma) / 2; }//area }//class

Para probar, basta crear un polgono, y aadir unos cuantos vrtices.


C# - Ejemplo de utilizacin

//ejemplo utilizacin Poligono p = new Poligono(); p.nuevoVertice(new Punto(2, 3 p.nuevoVertice(new Punto(7, 1 p.nuevoVertice(new Punto(5, 7

1 2 3 4 5 6 //ejemplo utilizacin Poligono p = new Poligono(); p.nuevoVertice(new Punto(2, 3)); p.nuevoVertice(new Punto(7, 1)); p.nuevoVertice(new Punto(5, 7)); Console.WriteLine(p.area());
Ultima edicin por vic . Pgina ltima modificacion en Lunes 13 de Agosto, 2012 13:46:42 CEST.

You might also like