Python: hier finden Sie Bereich der polygon aus xyz-Koordinaten
Ich versuche, die shapely.geometry.Polygon
Modul zu finden, die Fläche der Polygone, aber es führt alle Berechnungen auf der xy
Flugzeug. Dies ist gut für einige meiner Polygone, aber andere haben eine z
dimension zu, damit es nicht ganz tun, was ich möchte.
Gibt es ein Paket, welches entweder geben Sie mir die Fläche eines planaren Polygons aus xyz
Koordinaten, oder alternativ ein Paket oder einen Algorithmus, um zu drehen Sie das polygon, das die xy
Flugzeug, so dass ich verwenden können shapely.geometry.Polygon().area
?
Die Polygone werden dargestellt als eine Liste von Tupeln in der form [(x1,y1,z1),(x2,y2,z3),...(xn,yn,zn)]
.
- ein polygon ist eine streng 2-dimensionalen Abbildung. Was genau versuchst du zu berechnen?
- Ich bin versucht zu finden, die auf einer Fläche von Dächern und Wänden des Gebäudes von 'xyz' - Koordinaten der Eckpunkte.
- Ich habe nicht gefunden, einen Modul zu tun, aber Sie konnte einfach werfen die sich jedem Gesicht, zu einer xy-Ebene, und berechnen mit dem Modul, das Sie verwendet haben
- Was meinst du mit "cast down"?
- Nur drehen Sie die Form, bis es flach auf der z-Ebene.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist die Herleitung einer Formel zur Berechnung der Fläche eines 3D-planar Polygons
Hier ist Python-code implementiert:
Und um es zu testen, hier ist ein 10x5 Platz, der sich über Sie beugt:
Das problem war ursprünglich, das ich hatte, sehr stark vereinfacht. Es muss berechnen Sie den Einheitsvektor normal auf die Ebene. Das Gebiet ist die Hälfte des skalarprodukts und die Summe der cross-Produkte, nicht die Hälfte der Summe aller Helligkeiten in der cross Produkte.
Dies kann sein ein bisschen aufgeräumt (matrix-und vector-Klassen wäre es schöner, wenn Sie Sie haben, oder die standard-Implementierungen der Determinante/Kreuzprodukt/dot-Produkt), aber es sollte konzeptionell fundiert.
area
Funktion sollten gleich sein.cross_product_magnitude
würde sich ändernx = a[1] * b[2] - a[2] * b[1]
etc.abs()
beim Aufruf, so wie ich bin fasst alle Flächen und einige der Bereiche negativ aus kommen:poly_area = abs(area(poly))
.abs
auf meine Antwort auf Vollständigkeit. Es hat zu tun mit Stokes' Theorem und wie Bereichen unterzeichnet werden kann, je nach der Richtung, in die Sie integrieren, um den Umfang.unit_normal
unddet
sind nicht erforderlich. Es ist genug, umnorm(total)
(viel einfacher zu berechnen;norm
geschrieben werden sollte).Dies ist der Letzte code, den ich verwendet habe. Es nicht leicht, formschön, sondern implementiert Stoke ' s theorem zur Berechnung der Fläche direkt. Es baut auf @Tom Smilack Antwort, die zeigt, wie es zu tun, ohne numpy.
Fyi, hier ist der gleiche Algorithmus in Mathematica, mit einem baby unit-test
planeUnitNormal
Berechnung ist nicht robust, falls die erste drei Punkte sind colinear. Ein intelligenter Algorithmus wählen Sie drei Punkte, die nicht colinear (Prüfung durchpairwise[...,Cross]=!=0
werfen und wenn Sie nicht finden können, drei.Bereich eines 2D-Polygons kann berechnet werden, Numpy als ein one-liner...
Gleiche wie @Tom Smilack Antwort, aber in javascript
JS: