Un épicycloïde est la courbe qu'un point sur un cercle fait en roulant autour d'un autre cercle. Un cyclogon est la forme qu'un point sur un polygone régulier prend lorsqu'il roule sur un plan. Un épicyclogon est la courbe tracée par un point sur un polygone régulier lorsqu'il s'enroule autour d'un autre.
Écrire un programme qui dessine un epicyclogon donné r
, r1
, r2
, n1
, n2
:
r = number of clockwise revolutions rolling polygon makes around stationary polygon (any real number as limited by float values)
r1 = distance from center of stationary polygon to each of its vertices (positive real number)
r2 = distance from center of rolling polygon to each of its vertices (positive real number)
n1 = number of sides stationary polygon has (integer greater than 2)
n2 = number of sides rolling polygon has (integer greater than 2)
Remarques
- Lorsqu'il
r
est négatif, le rouleau doit aller dans le sens antihoraire . - Car
r
, une révolution se produit lorsque la ligne reliant les centroïdes des deux formes balaie 360 degrés. Cette notion est développée pour inclure toutes les valeurs der
. (Ainsi, en un quart de tour, la ligne reliant les centroïdes balaye de 90 degrés.) - Ces arguments devraient provenir de la ligne de commande ou votre programme devrait les demander (par exemple avec Python
input()
). r1
etr2
sont relatifs les uns aux autres, et non aux dimensions de l'image. Vous pouvez donc définir une "unité" comme étant un nombre quelconque de pixels réels.
Le point à tracer est l'un des sommets de la forme roulante. Les formes doivent commencer avec ce sommet touchant un sommet stationnaire et deux côtés adjacents:
Les sommets de départ exacts et l'angle du polygone stationnaire n'ont pas d'importance.
Sortie
La sortie doit aller vers une image d'au moins 600x600 pixels (ou une dimension variable qui peut être définie sur 600). Il doit montrer toute la courbe d'épicyclogone spécifiée par les paramètres, bien cadrée dans l'image.
Les polygones roulants et stationnaires doivent également être dessinés (avec le rouleau dans son état final). Les deux formes et l'épicyclogone doivent être de trois couleurs sensiblement différentes.
Il doit également y avoir un moyen simple de ne pas dessiner les polygones (un changement de true
à false
dans le code suffit).
Veuillez nous montrer au moins 2 images de sortie. Vous pouvez les rétrécir si nécessaire.
Notation
Le code le plus court qui produit des images de sortie valides l'emporte.
Bonus
- Moins 50 octets si la sortie est un gif animé (ou similaire) de la courbe en cours de dessin.
- Moins 150 octets si vous laissez
n1
etn2
prenez la valeur 2 pour que les formes deviennent des segments de ligne de longueur2 * r1
(our2
), "roulant" les uns sur les autres. La façon dont vous gérezr
quandn1
etn2
êtes 2 dépend de vous, car les centroïdes ne tournent pas l'un autour de l'autre comme ils le font dans d'autres cas. (Ne pas «rouler» du tout ne compte pas comme le manipuler.)
Étant donné que je suis très impatient de voir cette idée de roman bien exécutée (et ce n'est pas exactement un gâteau), je vais attribuer 150 représentants de primes au gagnant. Le concours se terminera le jour même où la prime s'épuise.
La prime ne sera pas attribuée au gagnant s'il est clair qu'il a simplement réécrit la plupart du code d'une autre soumission.
Les fonctions de bibliothèque qui se produisent déjà (s'il y en a) ne sont pas autorisées.
Remarque: cela vient de mes questions restantes que tout le monde est libre de publier. Mais si personne d'autre ne les affiche, il y a de fortes chances que je le fasse à temps. : P
la source
Réponses:
MATLAB: 735 octets - 200 bonus = 535
Mon programme gère le cas n = 2 et dessine une animation en temps réel. Il existe quelques différences entre les versions golfée et non golfée:
La version non golfée n'a qu'une option pour enregistrer l'animation dans un fichier 'g.gif', en définissant
savegif = 1
le code. Il est désactivé par défaut car il peut être gênant pour plusieurs raisons:L'économie de gif a dû être abandonnée dans la version golfée car elle prenait environ 100 octets, dépassant la taille du bonus.La version non golfée dessine un cercle sur le sommet du traceur. Il produit également plus d'images et se déplace plus rapidement (bien que cela puisse être ajusté dans la version golfée en changeant les nombres).
Échantillons:
f(11,5,90,2,99,0)
après la fin du programmeepic(1.3,4,2,6,6,1)
avec sortie gifCode non golfé
Code golf
Instructions:
Enregistrez la fonction dans un fichier du même nom, c'est
epic.m
-à- dire ouf.m
. Exécutez-le en appelant la fonction à partir de la console Matlab.Utilisation:
epic(r, r1, r2, n1, n2, dispPoly)
oùdispPoly
est une variable booléenne (zéro si faux, un nombre différent de zéro si vrai) déterminant s'il faut dessiner les polygones.Modifier: Ajout d'un bonus de 50 pour l'image animée.
la source
Java -
27262634 - 200 = 2434 caractèresAmélioré de 3800 octets ish
Merci à tous pour vos suggestions (surtout pseudonyme117), voici la nouvelle version.
J'ai ajouté une classe P qui est la classe de points et une classe L qui étend ArrayList
J'ai également ajouté quelques modifications logiques mineures.
Voici la classe principale (non golfée):
Et la version golfée:
Ainsi que les classes P:
Et moi:
Remplacez int d par 0 ou 1 pour afficher les polygones
arguments - 1 100 50 5 2
args - 1,5 100 100 7 3
args - 2 40 100 3 7
la source
r
vraiment 50 dans tous vos exemples? Cela signifierait que le rouleau va environ 50 fois.RotatingPolygonsGolfed
dans le code "golfé" alors qu'il est justeRotatingPolygons
dans le code normal. ;)Javascript, 1284 caractères (-200 = 1084 caractères)
Le code réduit est
Le code complet est
Un violon pour voir la routine dans toute sa splendeur polygonale (et pour démontrer l'animation) se trouve à
http://jsfiddle.net/7rv751jy/2/embedded/result/
Le script définit une fonction appelée
epi
qui accepte les cinq paramètres répertoriés dans l'OP.epi
renvoie une fonction avec la signature(e,t,isCCW,flags)
qui accepte les arguments:e
- une référence à un élément de toile HTML5 600x600 sur lequel effectuer le rendut
- l'angle total (en radians) que le centroïde du deuxième polygone doit balayer autour du centroïde du premier. L'argument transmis ne doit pas dépasser 2 pi fois le nombre de rotations passées àepi
.isCCW
- booléen indiquant si la trace doit se poursuivre dans le sens antihoraire (par opposition à un sens horaire)flags
- un ensemble de drapeaux de bits indiquant quels éléments doivent être rendusLa fonction peut être appelée un certain nombre de fois avec différents ensembles d'arguments.
Quelques notes:
La routine gère les cas dégénérés où
n1 = 2
et / oun2 = 2
. Lors de l'animation, certaines combinaisons de longueurs entraîneront des avances rapides et soudaines dans la trace. Cela est dû au fait que les images d'animation sont indexées par l'angle du centroïde du deuxième polygone et que le d thêta poly2 / d le centroïde thêta devient singulier dans les cas où le centroïde du poly 2 recto verso est proche d'un sommet du poly 1 recto verso. Cependant, cela n'affecte pas la trace.Les noms des paramètres
epi
apparaîtront déroutants car tout au long du développement, j'ai appelé le polygone 1 "2" et le polygone 2 "1". Quand j'ai réalisé l'incohérence entre ma convention et celle de l'OP, plutôt que d'échanger tous les indices dans le code, j'ai simplement échangé l'ordre des arguments dansepi
.Le violon ci-dessus importe jQuery, mais c'est pour gérer l'interface utilisateur. La
epi
fonction n'a pas de dépendances de bibliothèque.Le code gère les traces CCW en inversant simplement l'axe Y. Ceci est quelque peu inélégant puisque le polygone 2 commence dans une position inversée Y pendant les traces CCW, mais personne n'a dit que la routine devait être élégante. ;)
la source
nt = ~~(t*(r_>rC?r_:rC)+1)
ennt = ~~(t*(r_>rC?r_:rC)/10+1)
et cela devrait accélérer un peu les choses.