Área de un polígono

De MateWiki
Saltar a: navegación, buscar

En este artículo vamos a hacer una función en MATLAB que calcula el área de un polígono.

1 Deducción de la fórmula

Vamos a empezar deduciendo una fórmula general a partir de las coordenadas de sus vértices.Supongamos primero que es un triángulo con vértices [math] V_i = (x_i,y_i), \; i=1,2,3[/math]
Triángulo
. Si definimos [math] \{ \vec i, \vec j\} [/math] los vectores de la base cartesiana en la que están dados los vértices, entonces dos lados del triángulo están formados por los vectores:

[math] \vec{V_1V_2} = (x_2-x_1)\vec i + (y_2-y_1)\vec j, \qquad \vec{V_1V_3} = (x_3-x_1)\vec i + (y_3-y_1)\vec j. [/math]

El módulo del producto vectorial de estos vectores es el área del paralelogramo que forman, es decir el doble del área del triángulo. Por tanto,

[math] \begin{eqnarray*} S&=&\frac12 |\vec{V_1V_2} \times \vec{V_1V_3}| = \frac12|((x_2-x_1)(y_3-y_1)-(x_3-x_1)(y_2-y_1))(\vec i \times \vec j)|\\ &=&\frac12|y_1(x_3-x_1)+y_2(x_1-x_3)+y_3(x_2-x_1)|=\frac12|\sum_{i=1}^3y_i(x_{i-1}-x_{i+1})|, \end{eqnarray*} [/math]

tomando la regla de que [math]x_0=x_3, \; x_4=x_1[/math].

En el caso de un polígono convexo podemos numerar los vértices en sentido horario (o antihorario), triangulizarlo usando las diagonales a partir de un vértice y sumar el área de los triángulos que se forman.
triangulación a partir de las diagonales para calcular el área como la suma de las áreas de los triángulos que lo forman

Siguiendo el mismo proceso anterior para calcular el área de cada triángulo llegamos fácilmente a una fórmula similar. Concretamente, en el caso particular del pentágono de la figura,

[math] \begin{eqnarray*} S&=&\frac12 |\vec{V_1V_2} \times \vec{V_1V_3}|+\frac12 |\vec{V_1V_3} \times \vec{V_1V_4}|+\frac12 |\vec{V_1V_4} \times \vec{V_1V_5}| \\ &=& \frac12 |\vec{V_1V_2} \times \vec{V_1V_3}+\vec{V_1V_3} \times \vec{V_1V_4}+\vec{V_1V_4} \times \vec{V_1V_5}| =\frac12|\sum_{i=1}^5y_i(x_{i-1}-x_{i+1})|, \end{eqnarray*} [/math]

tomando la regla de que [math]x_0=x_5, \; x_6=x_1[/math]. El punto clave en la identidad anterior es la primera igualdad, que se da porque los tres vectores [math]\vec{V_1V_2} \times \vec{V_1V_3}, \; \vec{V_1V_3} \times \vec{V_1V_4}, \; \vec{V_1V_4} \times \vec{V_1V_5} [/math] tienen la misma dirección y sentido. Sólo cambia su módulo. Por tanto, en este caso el módulo de la suma coincide con la suma de los módulos.

En el caso general de n vértices, la fórmula quedaría:

[math] S=\frac12|\sum_{i=1}^ny_i(x_{i-1}-x_{i+1})| [/math]

tomando la regla de que [math]x_0=x_n, \; x_{n+1}=x_1[/math].

Por último, si el polígono es no convexo, es fácil ver que la misma fórmula se verifica. Basta interpretar el término dentro del valor absoluto como suma de áreas y darse cuenta de que el área de la parte que no está en el polígono aparece dos veces y con signos contrarios, y por tanto se cancela.

Observación: Los primeros y segundos momentos de inercia de un polígono pueden obtenerse con fórmulas similares siguiendo este mismo proceso.

2 Función en Matlab

A continuación se muestra como crear una función en Matlab que calcula el área de un polígono a partir de una matriz con los vértices ordenados es sentido antihorario.

% Función para calcular el área de un polígono
function S=ar_pol(C)
% Se introduce una matriz C con las coordenadas de los vértices del polígono 
% por columnas y ordenados en sentido horario o antihorario. 
% Se devuelve el área S
% Aplicamos la fórmula deducida anteriormente
% S = 1/2 abs(sum yi (x_(i-1)-x_(i+1)))
% teniendo en cuenta la siguiente regla: (x_0,y_0)=(x_n,y_n) y 
% (x_(n+1),y_(n+1))=(x_1,y_1)
% donde n es el número de vértices

% Primero calculamos el número de vértices nv
nv=length(C);
% Ahora definimos los vectores con las coordenadas x e y de los vértices
x=C(1,:);    % la primera fila contiene las coordenadas x de los vértices
y=C(2,:);    % la segunda fila contiene las coordenadas y de los vértices
% Calculamos S pero separamos el primer y último término de la suma
% para poder tener en cuenta la regla
S = y(1)*(x(nv)-x(2));           % primer término
for i=2:nv-1
   S = S+y(i)*(x(i-1)-x(i+1));   % términos del 2 al nv-1
end
S = S+y(nv)*(x(nv-1)-x(1));      % último término
S=0.5*abs(S);


Es importante grabar esta función en un fichero con el mismo nombre elegido para la función. En este caso: ar_pol.m. Una vez creada la función y grabada en el mismo directorio donde está nuestro programa principal, la podemos usar en nuestro programa. Por ejemplo

% Este es el programa principal
% Definimos una matriz con las coordenadas del polígono
c=[-1 0 -1 1 1;-1 0 1 1 -1];
% Calculamos su área
S=ar_pol(c)