Hi, habe mich gerade mal "ein Bisschen" damit beschäftigt.
Wer's mal braucht, bitte sehr, auf eigene Gefahr, (at own risk).
Der Ansatz ist: PGon in Dreiecke zerlegen. SPs der Dreiecke ermitteln, Flächen der Dreiecke ermitteln unter Nutzung der Flächenvorzeichen (Das ist der Trick
🙂), ermitteln ob Dreieck in anderem, benacchbartem Dreieck enthalten ist und somit NICHT zu berücksichtigen ist,
Gesamt-SP ermittel. <120 Zeilen Programmcode - finde ich vertretbar.
Habe noch keinen PGon gefunden wo es NICHT funktioniert, solange sich die Konturen NICHT schneiden und das Parameter-Script ausgeführt wird.
auf 120g-Papier ausdrucken, ausschneiden, auf den Tikki legen, grinsen !!!
Wenn sich bitte wer findet - ich denke da an einen ganz Speziellen - der die DynHoSpo-Einfüge-Option reinbasteln könnten!
🙂)
Gruß
! PARAMETER
!!! PktAnz (Ganzzahl)
!!! PktX (Länge) (Als eindimensionales ARRAY)
!!! PktY (Länge) (Als eindimensionales ARRAY)
!PARAMETER-SCHRIPT
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!! Sorge tragen, dass wenn die Punktanzahl erhöht wird, die Neuen Punkte beim letzten eingefügt werden !!!!!!
FOR i = PktAnz+1 TO 50
PARAMETERS PktX
= PktX[PktAnz],
PktY = PktY[PktAnz]
NEXT i
IF PktAnz > 50 THEN PARAMETERS PktAnz = 50
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!2D-SCRIPT
!!!!!! https://de.wikipedia.org/wiki/Punkt-in- ... ach_Jordan
!!!!!! http://media2mult.uni-osnabrueck.de/pmw ... in.Polygon
!!!!!! https://www.inf.hs-flensburg.de/lang/al ... olygon.htm
!!!!!!!!!! copyright Ma_Scht, Jun. 2020 !!!!!!!!!!!!!!
!!!!!!!! For free use, but at one's own risk. !!!!!!!!
!!!!! Zur freien Verwendung, auf eigenes Risiko !!!!!!
!! Solidarität mit Armen - Spendet mal für was Anderes als den Fussballverein Eurer Kinder !!
!! und auch mal mehr als 5€ !!
!! Eine Grauer Star OP kostet in Afrika 30 € - und ein Kind kann wieder sehen !!
!! Christliche BLindenmission z.B. !!
!! Bitte nachdenken bevor das Pulver in die nächste Schw...protese gesteckt wird !!
EPS = -0.00001
unID =1
lll= 0.05 !!!! Länge von Hilsmarkierungen, etc.
hlp = 0
umfang = 0
summeSPxMalA = 0
summeSPyMalA = 0
summeFlaechen = 0
DIM seitenlaengeA[],
seitenlaengeB[],
seitenlaengeC[],
sss[],
flaeche[],
seitenhalbierendeX[],
seitenhalbierendeY[],
schwerPktX[],
schwerPktY[],
steuerVZ[],
flaecheAufNULLsetzenJN[]
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!! Eckpunkte des Polygons !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
FOR i = 1 TO PktAnz
! Vertikale Richtung
HOTSPOT2 PktX ,0 ,unID ,PktY ,1+128 : unID=unID+1 !Basisfangpunkt
HOTSPOT2 PktX ,PktY ,unID ,PktY ,2, PktY,"Y Pkt.Nr: " + STR(i,1,0) : unID=unID+1 !beweglicher Fangpunkt
HOTSPOT2 PktX ,-1 ,unID ,PktY ,3 : unID=unID+1 !Referenzrichtung
! Horizontale Richtung
HOTSPOT2 0 ,PktY ,unID ,PktX ,1+128 : unID=unID+1 !Basisfangpunkt
HOTSPOT2 PktX ,PktY ,unID ,PktX ,2, PktX,"X Pkt.Nr: " + STR(i,1,0) : unID=unID+1 !beweglicher Fangpunkt
HOTSPOT2 -1 ,PktY ,unID ,PktX ,3 : unID=unID+1 !Referenzrichtung
NEXT i
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!! Außenkonturen des Polygons !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
FOR i = 1 TO PktAnz-1
LINE2 PktX,PktY, PktX[i+1],PktY[i+1]
HOTLINE2 PktX,PktY, PktX[i+1],PktY[i+1], unID : unID=unID+1
umfang = umfang + SQR( (PktX[i+1] - PktX)^2 + (PktY[i+1] - PktY)^2 )
NEXT i
LINE2 PktX[PktAnz],PktY[PktAnz], PktX[1],PktY[1]
HOTLINE2 PktX[PktAnz],PktY[PktAnz], PktX[1],PktY[1], unID : unID=unID+1
umfang = umfang + SQR( (PktX[PktAnz] - PktX[1])^2 + (PktY[PktAnz] - PktY[1])^2 )
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!! 1. und Letzter Punkt, GRAFISCHE Hervorhebung !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
LINE2 PktX[1]-lll,PktY[1]-lll, PktX[1]+lll,PktY[1]+lll
LINE2 PktX[1]-lll,PktY[1]+lll, PktX[1]+lll,PktY[1]-lll
CIRCLE2 PktX[PktAnz],PktY[PktAnz], lll !!!! Letzter Pkt.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!! Ergänzungskanten der gebildeten Einzeldreiecke !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
FOR i = 3 TO PktAnz-1
hlp = hlp + 1
! LINE2 PktX[1],PktY[1], PktX,PktY
NEXT i
anzahlZwischenlinien = hlp
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!! Schwerpunkte der Einzelfläche berechnen!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
FOR i = 2 TO PktAnz-1
pkt0X = pktX[3]
pkt0Y = pktY[3]
seitenhalbierendeX = PktX[1] + 0.5 * ( PktX[i+1] - PktX[1] )
seitenhalbierendeY = PktY[1] + 0.5 * ( PktY[i+1] - PktY[1] )
!!! CIRCLE2 seitenhalbierendeX, seitenhalbierendeY, 0.05
!!! LINE2 PktX, PktY, seitenhalbierendeX, seitenhalbierendeY
schwerPktX = PktX + 2/3 * ( seitenhalbierendeX - PktX )
schwerPktY = PktY + 2/3 * ( seitenhalbierendeY - PktY )
! CIRCLE2 schwerPktX, schwerPktY, lll
! HOTSPOT2 schwerPktX, schwerPktY, unID : unID=unID+1
NEXT i
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!! Berechnung des Flächeninhaltes gem https://www.inf.hs-flensburg.de/lang/al ... olygon.htm !!
!!!!!!!!!!! Fläche ist POSITIV wenn P-Gon im UZS gezeichnet, oder NEGATIV wenn P-Gon GEGEN den UZS gezeichnet !!!!
!!!!!!!!!!! VORWÄRTS-BERECHNUNG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
FOR i = 1 TO PktAnz-2
flaeche = 0.5 * ((PktX[i+1]-PktX[1]) * (PktY[i+2]-PktY[1]) - (PktX[i+2]-PktX[1]) * (PktY[i+1]-PktY[1]))
! TEXT2 schwerPktX[i+1],schwerPktY[i+1], "A" + STR(i,1,0) + ": " + STR(flaeche,3,2) + "m2"
IF flaeche < 0 THEN !!!! Steuer-VZ für die anschließende Prüfung
steuerVZ = -1
ELSE
steuerVZ = 1
ENDIF
NEXT i
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!! PFÜRUNG ob Test-Punkt im DIRENKTEN FOLGE-Dreieck ist oder NICHT !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!! VORWÄRTS-BERECHNUNG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
FOR i = 3 TO PktAnz-2
pkt1X = PktX[i-1]
pkt1Y = PktY[i-1]
pkt2X = PktX[i-2]
pkt2Y = PktY[i-2]
pkt3X = PktX[1]
pkt3Y = PktY[1]
pkt0X = pkt3X !!! Pkt NULL ist erf., da Anfang und Ende geschlossen sein müssen
pkt0Y = pkt3Y
pktTestX = PktX !!! Testet ob Pkt. Nr. 4 beispielsweise in Fläche Nr. 4 enthalten ist (Folgenfläche)
pktTestY = PktY !!! Gleicher Test muss noch mit der VORGÄNGERfläche gemacht werden
pktAX = pktTestX
pktAY = pktTestY
!!!! ERSTE VERGLEICHSRUNDE
pktBX = pkt0X
pktBY = pkt0Y
pktCX = pkt1X
pktCY = pkt1Y
delta1 = steuerVZ * ( (pktBX - pktAX) * (pktCY - pktAY) - (pktBY - pktAY) * (pktCX - pktAX) )
! TEXT2 pktTestX,pktTestY-0.200, "delta 1: " + STR(delta1,4,3)
!!!! ZWEITE VERGLEICHSRUNDE
pktBX = pkt1X
pktBY = pkt1Y
pktCX = pkt2X
pktCY = pkt2Y
delta2 = steuerVZ * ( (pktBX - pktAX) * (pktCY - pktAY) - (pktBY - pktAY) * (pktCX - pktAX) )
! TEXT2 pktTestX,pktTestY-0.400, "delta 2: " + STR(delta2,4,3)
!!!! DRITTE VERGLEICHSRUNDE
pktBX = pkt2X
pktBY = pkt2Y
pktCX = pkt3X
pktCY = pkt3Y
delta3 = steuerVZ * ( (pktBX - pktAX) * (pktCY - pktAY) - (pktBY - pktAY) * (pktCX - pktAX) )
! TEXT2 pktTestX,pktTestY-0.600, "delta 3: " + STR(delta3,4,3)
!!! ENDE der VERGLEICHRUNDEN
IF delta1 < 0 | delta2 < 0 | delta3 < 0 THEN
! TEXT2 pktTestX,pktTestY, "NICHT im VorDreieck"
flaecheAufNULLsetzenJN = 1
ELSE
! TEXT2 pktTestX,pktTestY, "IST im VorDreieck"
flaecheAufNULLsetzenJN = 0
ENDIF
NEXT i
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!! FESTLEGUNG welche der Flächen zu IGNORIEREN, sprich auf NULL zu setzen ist !!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!! ( Das sind alle Fläche, die bereits in abzugflächen (negative Flächen) komplett enthalten sind ) !!!
FOR i = 2 TO PktAnz-3
IF flaeche > 0 & flaeche[i-1] < 0 & flaecheAufNULLsetzenJN[i+2] = 0 THEN
flaeche = 0
! TEXT2 0,1+i*0.20, "A" + STR(i,1,0) + ": " + STR(flaeche,3,2) + "m2"
ELSE
flaeche = flaeche
! TEXT2 0,1+i*0.20, "A" + STR(i,1,0) + ": " + STR(flaeche,3,2) + "m2"
ENDIF
NEXT i
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!! GESAMT-SCHWER-PUNKT !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
FOR i = 1 to PktAnz-2
summeSPxMalA = summeSPxMalA + schwerPktX[i+1] * flaeche
summeSPyMalA = summeSPyMalA + schwerPktY[i+1] * flaeche
summeFlaechen = summeFlaechen + flaeche
NEXT i
GSPx = summeSPxMalA / summeFlaechen
GSPy = summeSPyMalA / summeFlaechen
CIRCLE2 GSPx,GSPy, lll
HOTSPOT2 GSPx,GSPy, unID : unID=unID+1
TEXT2 GSPx,GSPy-1*lll, "SP"
TEXT2 GSPx,GSPy-3*lll, "x:" + STR( GSPx,4,3)
TEXT2 GSPx,GSPy-5*lll, "y:" + STR( GSPy,4,3)
TEXT2 GSPx,GSPy-7*lll, "A:" + STR( ABS(summeFlaechen),3,2) + "m2"
TEXT2 GSPx,GSPy-9*lll, "U:" + STR( ABS(umfang),3,2) + "m"