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

Schwerpunkt eines Polygones berechnen

Hmooslechner
Rockstar
Kennt jemand von Euch eine einfache Möglichkeit, den Schwerpunkt einer Polygonfläche zu berechnen?

Ich kenne die Möglichkeiten, eine unregelmäßige Fläche in Scheiben zu schneiden, die entstehenden Trapeze lassen recht einfach den Schwerpunkt der Einzelteile ermitteln und dann über ein Achsmoment die "Gewichtung" der einzelnen Teilflächen mitteln.

Dies Programmäßig umzusetzen - nur um den "Mittelpunkt" zum Einsetzen eines Textblockes zu ermitteln ist wohl "mit Kanonen auf Spatzen schießen"

Gibts da was einfaches? Die Statiker unter Euch müßten sowas eigentlich wissen.. - Etwa so - gib die Koordinaten der Polygonpunkte in eine Matrix und bekomme die XY des Schwerpunktes..
AC5.5-AC27EduAut, PC-Win10, MacbookAirM1, MacbookM1Max, Win-I7+Nvidia
1 ANTWORT 1
Ma_Scht
Advocate
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"

Keine Antwort gefunden?

Andere Beiträge
im Board ansehen

Zurück zum Board

Neueste Lösungen durchsuchen

Akzeptierte Lösungen zeigen

Eine neue Diskussion starten!

Neues Thema erstellen