Aus Wikipedia :
Der Schwerpunkt eines geschlossenen Polygons, das sich nicht selbst schneidet und durch n Eckpunkte ( x 0 , y 0 ), ( x 1 , y 1 ), ..., ( x n - 1 , y n - 1 ) definiert ist, ist der Punkt ( C x , C y ), an dem
und wo A die Fläche des Polygons ist,
In diesen Formeln wird angenommen, dass die Eckpunkte in der Reihenfolge ihres Auftretens entlang des Umfangs des Polygons nummeriert sind. Außerdem wird angenommen, dass der Scheitelpunkt ( x n , y n ) derselbe ist wie ( x 0 , y 0 ), was bedeutet, dass i + 1 im letzten Fall auf i = 0 umlaufen muss . Beachten Sie, dass der Bereich A , der wie oben berechnet wurde, ein negatives Vorzeichen hat , wenn die Punkte im Uhrzeigersinn nummeriert werden. Die Schwerpunktkoordinaten sind jedoch auch in diesem Fall korrekt.
- Suchen Sie anhand einer Liste von Eckpunkten in der angegebenen Reihenfolge (entweder im oder gegen den Uhrzeigersinn) den Schwerpunkt des geschlossenen Polygons, das sich nicht selbst schneidet und durch die Eckpunkte dargestellt wird.
- Wenn dies hilft, können Sie davon ausgehen, dass die Eingabe nur im Uhrzeigersinn oder nur im Gegenuhrzeigersinn erfolgt. Sagen Sie dies in Ihrer Antwort, wenn Sie dies benötigen.
- Die Koordinaten müssen keine ganzen Zahlen sein und können negative Zahlen enthalten.
- Die Eingabe ist immer gültig und enthält mindestens drei Eckpunkte.
- Es müssen nur Eingaben verarbeitet werden, die zum nativen Gleitkomma-Datentyp Ihrer Sprache passen.
- Sie können davon ausgehen, dass Eingabenummern immer einen Dezimalpunkt enthalten.
- Sie können davon ausgehen, dass ganze Zahlen mit
.
oder enden.0
. - Sie können komplexe Zahlen für die Eingabe verwenden.
- Die Ausgabe sollte auf das nächste Tausendstel genau sein.
Beispiele
[(0.,0.), (1.,0.), (1.,1.), (0.,1.)] -> (0.5, 0.5)
[(-15.21,0.8), (10.1,-0.3), (-0.07,23.55)] -> -1.727 8.017
[(-39.00,-55.94), (-56.08,-4.73), (-72.64,12.12), (-31.04,53.58), (-30.36,28.29), (17.96,59.17), (0.00,0.00), (10.00,0.00), (20.00,0.00), (148.63,114.32), (8.06,-41.04), (-41.25,34.43)] -> 5.80104769975, 15.0673812762
Um jedes Polygon in einer Koordinatenebene anzuzeigen, fügen Sie die Koordinaten ohne eckige Klammern in das Menü "Bearbeiten" dieser Seite ein .
Ich habe meine Ergebnisse mit diesem schrecklichen Polygon Centroid Point Calculator bestätigt . Ich habe keine gefunden, bei der Sie alle Scheitelpunkte gleichzeitig eingeben können oder bei der nicht versucht wurde, Ihr -
Vorzeichen bei der ersten Eingabe zu löschen . Ich werde meine Python-Lösung für Sie bereitstellen, nachdem die Benutzer die Möglichkeit hatten, eine Antwort zu geben.
x
s undy
s wird das gesamte Gewicht auf die Scheitelpunkte verteilt und nicht über den Körper verteilt. Die erste Methode funktioniert zufällig, weil sie regelmäßig ist, sodass beide Methoden im Symmetriezentrum landen. Die zweite Methode funktioniert, weil bei Dreiecken beide Methoden zum gleichen Punkt führen.Antworten:
Gelee ,
2524222118 BytesWendet die im Problem gezeigte Formel an.
3 Bytes mit Hilfe von @ Jonathan Allan gespeichert .
Probieren Sie es online! oder Überprüfen Sie alle Testfälle.
Erläuterung
quelle
ṁL‘$ṡ2
mitṙ1ż@
oderżṙ1$
ṙ-ż
um den Tausch zu vermeiden und ein weiteres Byte zu sparenMathematica, 23 Bytes
Nehmen DAS , Jelly!Edit: Man schlägt Jelly nicht einfach ...
Erläuterung
Generieren Sie an den angegebenen Punkten ein Polygon mit Eckpunkten.
Finden Sie den Schwerpunkt des Polygons.
quelle
J, 29 Bytes
Wendet die im Problem gezeigte Formel an.
Verwendung
Erläuterung
quelle
Maxima,
124 118 116 112106 ByteIch habe keine Erfahrung mit Maxima, daher sind alle Hinweise willkommen.
Verwendung:
quelle
Schläger 420 Bytes
Ungolfed:
Testen:
Ausgabe:
quelle
R,
129127 BytesUnbenannte Funktion, die eine R-Liste von Tupeln als Eingabe verwendet. Das benannte Äquivalent kann aufgerufen werden mit zB:
Ungolfed und erklärte
Der letzte Schritt (
c(sum((x+X)*p),sum((y+Y)*p))/sum(p)*2/6
) ist eine vektorisierte Methode zur Berechnung vonCx
undCy
. Die Summe in den Formeln fürCx
undCy
wird in einem Vektor gespeichert und folglich durch die "Summe inA
" dividiert*2/6
. Z.B:und dann implizit gedruckt.
Probieren Sie es auf R-Geige
quelle
*2/6
könnte wohl sein/3
?sapply
, um mit diesen Listen umzugehen! Hier könnte es Spielraum zum Golfen geben, ich bin mir nicht sicher, wie flexibel die zulässige Eingabe ist. Wenn Sie beispielsweise nur eine Folge von Koordinaten eingeben dürfen,c(-15.21,0.8,10.1,-0.3,-0.07,23.55)
können Sie 17 Bytes einsparen, indem Sie die ersten Zeilen Ihrer Funktion durch ersetzeny=l[s<-seq(2,sum(1|l),2)];x=l[-s];
. Dies bedeutet,y
dass jedes Element mit geradem Indexl
undx
jedes Element mit ungeradem Index festgelegt wird.matrix(c(-15.21,0.8,10.1,-0.3,-0.07,23.55),2)
der Anfang Ihrer Funktion sein könntex=l[1,];y=l[2,];
, was 35 Bytes einspart. (Die Eingabematrix könnte in diesem Fall transponiert werdenx=l[,1];y=l[,2];
.) Natürlich ist die einfachste Lösung, wenn die Punktex
undy
nur als separate Vektoren eingegeben werdenfunction(x,y)
, aber ich denke nicht, dass dies zulässig ist ...c(...)
) sein und die Matrixkonvertierung müsste innerhalb der Funktion erfolgen.Python,
156127 BytesUngolfed:
Ideone es.
Dies nimmt jedes Punktepaar
[x, y]
als komplexe Zahlx + y*j
und gibt den resultierenden Schwerpunkt als komplexe Zahl im gleichen Format aus.Für das Punktepaar
[a, b]
und[c, d]
kann der Wert,a*d - b*c
der für jedes Punktepaar benötigt wird, aus der Determinante der Matrix berechnet werdenMit komplexer Arithmetik können die komplexen Werte
a + b*j
undc + d*j
als verwendet werdenBeachten Sie, dass der Imaginärteil der Determinante entspricht. Durch die Verwendung komplexer Werte können die Punkte auch in anderen Operationen auf einfache Weise komponentenweise summiert werden.
quelle
R + sp (46 Bytes)
Angenommen, das
sp
Paket ist installiert ( https://cran.r-project.org/web/packages/sp/ )Nimmt eine Liste von Scheitelpunkten auf (zum Beispiel
list(c(0.,0.), c(1.,0.), c(1.,1.), c(0.,1.))
)Nutzt die Tatsache aus, dass das "Labpt" eines Polygons der Schwerpunkt ist.
quelle
JavaScript (ES6), 102
Direkte Umsetzung der Formel
Prüfung
quelle
Python 2, 153 Bytes
Verwendet keine komplexen Zahlen.
Probieren Sie es online aus
Ungolfed:
quelle
Eigentlich
454039 BytesDies verwendet einen Algorithmus, der der Meilen-Gelee-Antwort ähnlich ist . Es gibt eine kürzere Möglichkeit, Determinanten mit einem Punktprodukt zu berechnen, aber derzeit gibt es einen Fehler mit dem Punktprodukt von Actually, bei dem es nicht mit Float-Listen funktioniert. Golfvorschläge sind willkommen. Probieren Sie es online!
Ungolfing
Eine kürzere, nicht wettbewerbsfähige Version
Dies ist eine weitere 24-Byte-Version, die komplexe Zahlen verwendet. Es ist nicht wettbewerbsfähig, da es auf Fehlerbehebungen beruht, die diese Herausforderung nachholen. Probieren Sie es online!
Ungolfing
quelle
C ++ 14, 241 Bytes
Ausgabe ist die Hilfsstruktur
P
,Ungolfed:
Verwendung:
quelle
Clojure,
177156143 BytesUpdate: Anstelle eines Rückrufs verwende ich
[a b c d 1]
als Funktion und das Argument ist nur eine Liste von Indizes zu diesem Vektor.1
wird bei der Berechnung als Sentinel-Wert verwendetA
.Update 2: Nicht vorberechnen
A
umlet
,(rest(cycle %))
um Eingabevektoren um eins versetzt zu bekommen.Originalfassung:
Bei weniger Golfplätzen:
Erstellt eine Hilfsfunktion,
F
die die Summierung bei jedem Rückruf implementiertl
. DennA
der Rückruf kehrt ständig zurück,1
während die X- und Y-Koordinaten ihre eigenen Funktionen haben.(conj(subvec v 1)(v 0))
Löscht das erste Element und hängt es an das Ende an. Auf diese Weise ist es einfach, den Überblick überx_i
und zu behaltenx_(i+1)
. Vielleicht gibt es noch einige Wiederholungen, die beseitigt werden müssen, insbesondere beim letzten Mal(map F[...
.quelle