abbrechen
Suchergebnisse werden angezeigt für 
Stattdessen suchen nach 
Meintest du: 
abbrechen
Suchergebnisse werden angezeigt für 
Stattdessen suchen nach 
Meintest du: 
Programmierung
Alles über Programmierung in GDL und Python

Test ob Punkt innerhalb eines Polygones liegt:

Hmooslechner
Moderator
Ich bin mathematisch nicht besonders "begabt" und ausgebildet.. Aus diesem Grund hat es mich sehr viel Zeit gekostet, eine Funktion zu finden, die für mich testen kann, ob ein gegebener Punkt (x,y) innerhalb der Grenzen eines Polygonzuges liegt - P[x][y] mit beliebiger Anzahl von Eckpunkten.

Geometrisch ist die Überlegung relativ einfach.

Man schickt vom Punkt aus einen Strahl in eine beliebige Richtung.
Schneidet sich der Strahl mit dem Polygon in ungerader Anzahl, liegt der Punkt innerhalb.
Schneidet sich der Strahl gar nicht mit dem Polygon - dann liegt er ausserhalb.
Schneidet sich der Strahl in gerader Anzahl mit dem Polygon - liegt er auch ausserhalb - der Strahl verläßt mit jedem 2. Schnittpunkt das Polygon wieder.


Ich bin zwar fähig, den Schnittpunkt 2er Geraden mit einer "requierierten" Funktion zu ermitteln, aber dann noch zu testen, ob sich der Punkt auf beiden STRECKEN (nicht GERADEN) befindet, da "hakts" bei mir schon wieder.

Man muss also für jede Strecke des Polygons - von Punkt zu Punkt - testen, ob es einen Schnittpunkt gibt, sich das merken und zusammenzählen.


In Archicad implementiert ist in den Makros der Objektbibliothek aber eine Sammlung von Funktionen, die das "können". Leider ist deren Nutzung so spärlich-spartanisch dokumentiert, dass es mich Tage gekostet hat, damit einigermaßen zurechtzukommen.

hier mal der funktionierende Beispielcode für den Test:


	

for i = 1 to points !! give the points fom the Code from Esteban Ramos to the stack

put x[i], y[i], 1 !! die 1 hinter den Koordinaten des Polygones im Stack ist n o t w e n d i g !!!

next i


call "PolygonOperations", !! http://www.graphisoft.com/ftp/techsupport/documentation/developer_docs/BasicLibraryDoc/15/Window-Macros/PolygonOperations.html
parameters opcode = 2, !! Point inside Polygone
srcPolygon1 = 2, !! Input from the GDL stack
srcPolygon2 = 0, !! Input from the GDL stack
result = 2, !! 1 = Output to a parameter (returned_parameter) 2 = to stack
pntX = Tx, !! Eingabe Koordinaten
pntY = Ty !! Eingabe Koordinaten

Ret = get(1)




Zur Erklärung: Die Funktion verlangt nicht nur die Koordinaten des Polygones, sondern auch einen weiteren Wert, damit man den Stack normalerweise zB. in Poly2_ direkt verwenden kann. (Für eine reine 2D-Berechnung wäre dies nicht nötig..)

Weiters wird normalerweise ein Polygon übergeben - ein 2-es Polygon könnte auch - wozu?? - übergeben werden.
Mit "Zahlenschaltern" (Flags) wird der funktion mitgeteilt, welche Art die "Eingabe" ist. (ob vom Stack oder einene Koordinatenliste im GDL-Style???), Auch die Art der "Ausgabe" - ob Stack oder Parameter wird so festgelegt.

Man bekommt unter "Ret" dann zurück - ob unser Testpunkt innerhalb, außerhalb, an der Kante liegt.

Ich hoffe, wenn ihr in die Verzweiflung geratet, sowas mal zu brauchen, dass Euch diese Info hilfreich ist.

Was kann "PolygonOperations" noch:

in der 15er Doku steht:

1 - Convert ArchiCAD style poligon data to GDL style polygon data
2 - Point inside polygon test
3 - Line-line intersection
4 - Segment-segment intersection
5 - Intersect polygons
6 - Calculate polygon area
7 - Reverse polygon

Für die Kalkulation einer Fläche des Polygones habe ich eine "einfachere" übersichtlichere Methode gefunden:


http://it.wikihow.com/Calcolare-l'Area-di-un-Poligono

umgesetzt in code wäre das dann beispielsweise so:


!! Gesamte Fläche:

SumA1 = 0

FOR i=1 to points


if i < points then A1 = x[i]*y[i+1]
if i = points then A1 = x[i]*y[1]

SumA1 = SumA1 + A1

NEXT i


SumA2 = 0

FOR i=1 to points


if i = 1 then A2 = x[i]*y[points]
if i > 1 and i < points then A2 = x[i]*y[i-1]

SumA2 = SumA2 + A2

NEXT i

!Text2 1.2, 1.2, "A1: " + str(SumA1, 4,2) + "m2"
!Text2 1.2, 1.1, "A2: " + str(SumA2, 4,2) + "m2"

Summe = (SumA1 - SumA2)/2
Text2 DeltaX/2, DeltaY/2, "Gesamtfläche: " + str(Summe, 4,2) + "m2"




Als Beispiel:



AC5.5-AC27EduAut, PC-Win10, MacbookAirM1, MacbookM1Max, Win-I7+Nvidia
0 ANTWORTEN 0