Saltar al contenido

¿Calcular el área de una polilínea?

Posteriormente a consultar expertos en la materia, programadores de deferentes áreas y profesores hemos dado con la solución al dilema y la plasmamos en este post.

Solución:

Esto no debería ser demasiado difícil de hacer en la tierra del usuario: mientras espera al equipo de TikZ, aquí hay un algoritmo simple de Shoelace hecho en Metapost simple. Compilar con mpost o adaptar para lualatex con luamplib.

prologues := 3;
outputtemplate := "%j%c.%outputformat";

vardef shoelace_area(expr p) = 
    for i=1 upto length p: 
        + 1/2 xpart point i of p * ypart point i+1 of p 
        - 1/2 ypart point i of p * xpart point i+1 of p 
    endfor
enddef;

beginfig(1);

    path t; t = for i=0 upto 4: 100 dir 72i -- endfor cycle;
    draw origin -- point 1 of t; label.lft(btex $R=100$ etex, 1/2 point 1 of t);
    draw t; dotlabel.rt(decimal shoelace_area(t), origin) withcolor 2/3 red;

    draw thelabel(btex $displaystyle A = 5over4R^2sqrt5+sqrt5over2$ etex, origin) scaled 3/4 shifted 30 down;
    draw thelabel(btex $A = 2.37764129 R^2$ etex, origin) scaled 3/4 shifted 54 down;

endfig;
end.

La figura del ejemplo lo aplica a un pentágono:

ingrese la descripción de la imagen aquí

Como he tratado de mostrar, esto te da alrededor de 6 sig. higo. de precisión utilizando la aritmética escalada de MP simple, y si la aplica a algo mucho más grande que esto, obtendrá un desbordamiento aritmético. Pero si compilas con mpost -numbersystem double obtienes una respuesta precisa y menos posibilidades de desbordamiento:

ingrese la descripción de la imagen aquí

Aplicación de la fórmula Shoelace utilizando Tikbiblioteca z math. Como ejemplo se toma la aplicación compleja en el enlace especificado por @Thruston.

documentclass[margin=3mm]standalone

usepackagetikz  
usetikzlibrarymath
usepackagetkz-euclide
tikzmath
x1 = 3; y1 =4; 
x2 = 5; y2 =11; 
x3 = 12; y3 =8;
x4 = 9; y4 =5;
x5 = 5; y5 =6;
Det = (x1*y2) + (x2*y3) + (x3*y4) + (x4*y5) + (x5*y1)-
(x2*y1) - (x3*y2) - (x4*y3) - (x5*y4) - (x1*y5);
Area = abs (Det / 2);
 

begindocument

begintikzpicture
tkzInit[xmax=13,ymax=12,xmin=0,ymin=0]
   tkzGrid
   tkzAxeXY

draw[fill=gray!30](x1,y1)--(x2,y2)--(x3,y3)--(x4,y4)--(x5,y5)--cycle;

 tkzText [below](6.5,-1)$A = Area$ ;
endtikzpicture

enddocument

ingrese la descripción de la imagen aquí

Comentarios y valoraciones del artículo

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *