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: