De Wikipédia :
Le centre de gravité d'un polygone fermé non auto-intersecté défini par n sommets ( x 0 , y 0 ), ( x 1 , y 1 ), ..., ( x n - 1 , y n − 1 ) est le point ( C x , C y ), où
et où A est la zone signée du polygone,
Dans ces formules, les sommets sont supposés être numérotés dans l'ordre de leur occurrence le long du périmètre du polygone. De plus, le sommet ( x n , y n ) est supposé être le même que ( x 0 , y 0 ), ce qui signifie que i + 1 dans le dernier cas doit boucler vers i = 0 . Notez que si les points sont numérotés dans le sens horaire, la zone A , calculée comme ci-dessus, aura un signe négatif; mais les coordonnées du centroïde seront correctes même dans ce cas.
- Étant donné une liste de sommets dans l'ordre (dans le sens horaire ou antihoraire), trouvez le centroïde du polygone fermé non auto-intersecté représenté par les sommets.
- Si cela peut vous aider, vous pouvez supposer que l'entrée est uniquement CW ou CCW uniquement. Dites-le dans votre réponse si vous en avez besoin.
- Les coordonnées ne sont pas obligatoirement des entiers et peuvent contenir des nombres négatifs.
- L'entrée sera toujours valide et contiendra au moins trois sommets.
- Il suffit de gérer les entrées qui correspondent au type de données en virgule flottante natif de votre langue.
- Vous pouvez supposer que les nombres entrés contiendront toujours un point décimal.
- Vous pouvez supposer que les entiers d'entrée se terminent par
.
ou.0
. - Vous pouvez utiliser des nombres complexes pour la saisie.
- La sortie doit être précise au millième près.
Exemples
[(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
Pour voir chaque polygone sur un plan de coordonnées, collez les coordonnées sans les crochets dans le menu "Edition" de cette page .
J'ai confirmé mes résultats en utilisant ce calculateur de points du polygone centroïde , ce qui est affreux. Je n'ai pas pu en trouver un sur lequel vous pouvez saisir tous les sommets à la fois, ou qui n'a pas essayé d'effacer votre -
signe lorsque vous le tapez en premier. Je publierai ma solution Python pour votre usage après que les gens auront eu la chance de répondre.
x
s ety
s met tout le poids dans les sommets au lieu d'être distribué sur le corps. La première fonctionne parce qu'elle est régulière, donc les deux méthodes se retrouvent au centre de symétrie. La seconde fonctionne parce que pour les triangles, les deux méthodes mènent au même point.Réponses:
Gelée ,
2524222118 octetsApplique la formule indiquée dans le problème.
Enregistré 3 octets avec l'aide de @ Jonathan Allan.
Essayez-le en ligne! ou Vérifiez tous les cas de test.
Explication
la source
ṁL‘$ṡ2
parṙ1ż@
oużṙ1$
ṙ-ż
pour éviter l'échange et économiser un autre octetMathematica, 23 octets
Prends ça , Jelly!Edit: On ne bat pas simplement Jelly ...
Explication
Générez un polygone avec des sommets aux points spécifiés.
Trouvez le centre de gravité du polygone.
la source
J, 29 octets
Applique la formule indiquée dans le problème.
Usage
Explication
la source
Maxima,
124118116112106106octetsJe n'ai pas d'expérience avec Maxima, donc tout indice est le bienvenu.
Usage:
la source
Raquette 420 octets
Non golfé:
Essai:
Production:
la source
R,
129127 octetsFonction sans nom qui prend en entrée une liste R de tuples. L'équivalent nommé peut être appelé en utilisant par exemple:
Non golfé et expliqué
La dernière étape (
c(sum((x+X)*p),sum((y+Y)*p))/sum(p)*2/6
) est une manière vectorisée de calculer à la foisCx
etCy
. La somme dans les formules pourCx
etCy
est stockée dans un vecteur et par conséquent divisée par la "somme dansA
"*2/6
. Par exemple:, puis imprimé implicitement.
Essayez-le sur R-fiddle
la source
*2/6
pourrait probablement l'être/3
?sapply
pour gérer ces listes! Il pourrait y avoir de la place pour jouer au golf ici, je ne suis pas sûr de la flexibilité de l'entrée autorisée. Si vous êtes autorisé à saisir uniquement une séquence de coordonnées, par exemplec(-15.21,0.8,10.1,-0.3,-0.07,23.55)
, vous pouvez enregistrer 17 octets en remplaçant les premières lignes de votre fonction pary=l[s<-seq(2,sum(1|l),2)];x=l[-s];
. C'est-à-dire, définiry
pour être chaque élément indexé pairl
etx
être chaque élément indexé impair.matrix(c(-15.21,0.8,10.1,-0.3,-0.07,23.55),2)
le début de votre fonctionx=l[1,];y=l[2,];
, ce qui économise 35 octets. (La matrice d'entrée pourrait être transposée, dans ce casx=l[,1];y=l[,2];
.) Bien sûr, la solution la plus simple est que les pointsx
ety
soient simplement entrés en tant que vecteurs séparésfunction(x,y)
, mais je ne pense pas que ce soit permis ...c(...)
) et la conversion matricielle devrait être effectuée à l'intérieur de la fonction.Python,
156127 octetsNon golfé:
Ideone it.
Cela prend chaque paire de points
[x, y]
comme un nombre complexex + y*j
et génère le centroïde résultant sous la forme d'un nombre complexe dans le même format.Pour la paire de points
[a, b]
et[c, d]
, la valeura*d - b*c
nécessaire pour chaque paire de points peut être calculée à partir du déterminant de la matriceEn utilisant l'arithmétique complexe, les valeurs complexes
a + b*j
etc + d*j
peuvent être utilisées commeNotez que la partie imaginaire est équivalente au déterminant. De plus, l'utilisation de valeurs complexes permet de sommer facilement les points par composant dans les autres opérations.
la source
R + sp (46 octets)
Suppose que le
sp
package est installé ( https://cran.r-project.org/web/packages/sp/ )Prend une liste de sommets, (par exemple
list(c(0.,0.), c(1.,0.), c(1.,1.), c(0.,1.))
)Profite du fait que le "labpt" d'un polygone est le centroïde.
la source
JavaScript (ES6), 102
Mise en œuvre directe de la formule
Tester
la source
Python 2, 153 octets
N'utilise pas de nombres complexes.
Essayez-le en ligne
Non golfé:
la source
En fait,
454039 octetsCelui-ci utilise un algorithme similaire à la réponse Jelly de Miles . Il existe un moyen plus court de calculer les déterminants à l'aide d'un produit scalaire, mais il existe actuellement un bogue avec le produit scalaire d'Actually où il ne fonctionnera pas avec les listes de flottants. Suggestions de golf bienvenues. Essayez-le en ligne!
Ungolfing
Une version plus courte et non compétitive
Il s'agit d'une autre version de 24 octets qui utilise des nombres complexes. Il n'est pas compétitif car il repose sur des correctifs de bogues postérieurs à ce défi. Essayez-le en ligne!
Ungolfing
la source
C ++ 14, 241 octets
La sortie est la structure d'aide
P
,Non golfé:
Usage:
la source
Clojure,
177156143 octetsMise à jour: Au lieu d'un rappel, j'utilise
[a b c d 1]
comme fonction et l'argument est juste une liste d'index de ce vecteur.1
est utilisé comme valeur sentinelle lors du calculA
.Mise à jour 2: pas de précalcul
A
àlet
, en utilisant(rest(cycle %))
pour obtenir un décalage d'un vecteur des vecteurs d'entrée.Version originale:
À l'étape moins golfée:
Crée une fonction d'assistance
F
qui implémente la sommation avec n'importe quel rappell
. CarA
le rappel revient constamment1
alors que les coordonnées X et Y ont leurs propres fonctions.(conj(subvec v 1)(v 0))
supprime le premier élément et ajoute à la fin, de cette façon, il est facile de garder une trace dex_i
etx_(i+1)
. Peut-être qu'il reste encore des répétitions à éliminer, surtout au dernier(map F[...
.la source