¿Calcular el área en una polilínea?

¿Calcular el área en una polilínea?

Hola compañeros tikzers.

¿Existe algún paquete/truco para calcular el área encerrada en una polilínea, es decir, por ejemplo, algo como esto?

\draw (p1) to (p2) to (p3) to cycle;

donde los puntos son los vértices. Es posible que el polígono no sea convexo.

Me imagino que el algoritmo de relleno podría mejorarse/modificarse para devolver el valor del área (en las unidades utilizadas). Pero no tengo la experiencia técnica y tal vez ya haya una respuesta.

Gracias.

PD: editado para agregar que el área es simplemente la integral a lo largo del límite

$$ \punto x dy $$

por lo que es muy fácil de calcular. Por supuesto, no me interesan sólo los cuadriláteros, sino las polilíneas con muchos vértices, por lo que el cálculo manual se vuelve irritantemente largo.

Respuesta1

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

\documentclass[margin=3mm]{standalone}

\usepackage{tikz}  
\usetikzlibrary{math}
\usepackage{tkz-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);
} 

\begin{document}

\begin{tikzpicture}
\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$} ;
\end{tikzpicture}

\end{document}

ingrese la descripción de la imagen aquí

Respuesta2

Esto no debería ser demasiado difícil de hacer en el terreno de los usuarios. Mientras esperas al equipo de TikZ, aquí tienes una sencillaAlgoritmo de cordoneshecho en llanoMetapost. Compilar con mposto adaptar para lualatexcon 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 = {5\over4}R^2\sqrt{5+\sqrt5\over2}$ 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 intentado mostrar, esto te da alrededor de 6 sig. higo. de precisión usando 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 compila, mpost -numbersystem doubleobtendrá una respuesta precisa y menos posibilidades de desbordamiento:

ingrese la descripción de la imagen aquí

información relacionada