Fläche in einer Polylinie berechnen?

Fläche in einer Polylinie berechnen?

Hallo, liebe Tikzer.

Gibt es ein Paket/Hack, um die Fläche zu berechnen, die in einer Polylinie eingeschlossen ist, also zum Beispiel so etwas

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

wobei die Punkte die Eckpunkte sind. Das Polygon muss nicht konvex sein.

Ich könnte mir vorstellen, dass der Füllalgorithmus verbessert/modifiziert werden könnte, um den Wert der Fläche (in den verwendeten Einheiten) zurückzugeben. Aber ich verfüge nicht über das technische Fachwissen und vielleicht gibt es bereits eine Antwort.

Danke schön.

PS: bearbeitet, um hinzuzufügen, dass die Fläche einfach das Integral entlang der Grenze ist

$$ \Punkt x dy $$

es ist also sehr einfach zu berechnen. Natürlich bin ich nicht nur an Vierecken interessiert, sondern an Polylinien mit vielen Eckpunkten, sodass die manuelle Berechnung ärgerlich langwierig wird.

Antwort1

Anwendung der Shoelace-Formel mit Tikz-Bibliothek math. Als Beispiel wird die komplexe Anwendung im von @Thruston angegebenen Link verwendet.

\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}

Bildbeschreibung hier eingeben

Antwort2

Dies sollte im Benutzerbereich nicht allzu schwer zu bewerkstelligen sein - während Sie auf das TikZ-Team warten, finden Sie hier eine einfacheSchnürsenkel-Algorithmusim Klartext gemachtMetapost. Kompilieren mit mpostoder anpassen lualatexmit 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.

Die Beispielabbildung wendet es auf ein Fünfeck an:

Bildbeschreibung hier eingeben

Wie ich zu zeigen versucht habe, erhalten Sie damit eine Genauigkeit von etwa 6 signifikanten Stellen, wenn Sie die skalierte Arithmetik von einfachem MP verwenden. Wenn Sie dies auf etwas anwenden, das viel größer ist, erhalten Sie einen arithmetischen Überlauf. Wenn Sie jedoch mit kompilieren, mpost -numbersystem doubleerhalten Sie eine genaue Antwort und die Wahrscheinlichkeit eines Überlaufs ist deutlich geringer:

Bildbeschreibung hier eingeben

verwandte Informationen