Un epicicloide es la curva que forma un punto en un círculo a medida que rueda alrededor de otro círculo. Un cyclogon es la forma que forma un punto en un polígono regular cuando rueda a través de un plano. Un epiciclogón es la curva trazada por un punto en un polígono regular a medida que rueda alrededor de otro.
Escribir un programa que dibuja un epicyclogon dada 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)
Notas
- Cuando
r
es negativo, el rodillo debe ir en sentido antihorario . - Porque
r
, una revolución ocurre cuando la línea que conecta los centroides de las dos formas barre 360 grados completos. Esta noción se expande para incluir todos los valores der
. (Entonces, en un cuarto de revolución, la línea que conecta los centroides se extiende 90 grados). - Estos argumentos deben provenir de la línea de comando o su programa debe solicitarlos (por ejemplo, con Python
input()
). r1
yr2
son relativos entre sí, no las dimensiones de la imagen. Por lo tanto, puede configurar una "unidad" para que sea cualquier número de píxeles reales.
El punto que debe trazar es uno de los vértices de la forma ondulada. Las formas deben comenzar con este vértice tocando un vértice estacionario y dos lados adyacentes:
Los vértices iniciales exactos y el ángulo del polígono estacionario no importan.
Salida
El resultado debe ir a una imagen que tenga al menos 600x600 píxeles (o alguna dimensión variable que se pueda establecer en 600). Debe mostrar toda la curva de epiciclogón especificada por los parámetros, bien enmarcada en la imagen.
Los polígonos estacionarios y rodantes también deben dibujarse (con el rodillo en su estado final). Las dos formas y el epiciclogón deben ser tres colores notablemente diferentes.
También debe haber una manera simple de no dibujar los polígonos ( basta con un cambio de true
a false
en el código).
Muéstranos al menos 2 imágenes de salida. Está bien reducirlos si es necesario.
Tanteo
El código más corto que produce imágenes de salida válidas gana.
Bonos
- Menos 50 bytes si la salida es un gif animado (o similar) de la curva que se está dibujando.
- Menos 150 bytes si deja
n1
yn2
toma el valor 2 para que las formas se conviertan en segmentos de línea de longitud2 * r1
(or2
), "rodando" uno alrededor del otro. La forma en que manejar
cuándon1
yn2
son 2 depende de usted, ya que los centroides no giran uno alrededor del otro como lo hacen en otros casos. (No "rodar" en absoluto no cuenta como manejarlo).
Como estoy bastante ansioso por ver esta idea novedosa bien ejecutada (y no es exactamente un juego de niños), voy a otorgar 150 recompensas al ganador. El concurso finalizará el mismo día que se agote la recompensa.
La recompensa no se otorgará al ganador si está claro que simplemente reescribieron la mayor parte del código de otro envío.
Las funciones de biblioteca que ya hacen esto (si hay alguna) no están permitidas.
Nota: Esto vino de mis preguntas sobrantes que cualquiera puede publicar libremente. Pero si nadie más los publica, hay una buena posibilidad de que lo haga a tiempo. :PAGS
fuente
Respuestas:
MATLAB: 735 bytes - 200 bonus = 535
Mi programa maneja el caso n = 2 y dibuja una animación en tiempo real. Hay algunas diferencias entre las versiones golfizadas y no golfistas:
La versión sin golf solo tiene una opción para guardar la animación en un archivo 'g.gif', configurando
savegif = 1
el código. Está desactivado por defecto, ya que puede ser molesto por algunas razones:El ahorro de gif tuvo que descartarse en la versión de golf, ya que tomó alrededor de 100 bytes, excediendo el tamaño de la bonificación.La versión sin golf dibuja un círculo en el vértice del trazador. También produce más cuadros y movimientos más rápidos (aunque esto se puede ajustar en la versión de golf cambiando los números).
Muestras:
f(11,5,90,2,99,0)
después de la finalización del programaepic(1.3,4,2,6,6,1)
con salida gifCódigo sin golf
Código de golf
Instrucciones:
Guarde la función en un archivo con el mismo nombre, es decir,
epic.m
of.m
. Ejecútelo llamando a la función desde la consola de Matlab.Uso:
epic(r, r1, r2, n1, n2, dispPoly)
dondedispPoly
es una variable booleana (cero si es falso, un número distinto de cero si es verdadero) que determina si se dibujan los polígonos.Editar: Se agregó una bonificación de 50 por imagen animada.
fuente
Java -
2,7262,634 - 200 = 2434 caracteresMejorado de 3800 bytes ish
Gracias a todos por sus sugerencias (especialmente pseudonym117), aquí está la nueva versión.
Agregué una clase P que es la clase de puntos y una clase L que extiende ArrayList
También agregué algunos cambios menores de lógica.
Aquí está la clase principal (no golfizada):
Y la versión de golf:
Además de las clases P:
Y yo:
Cambie int d a 0 o 1 para mostrar polígonos
argumentos - 1 100 50 5 2
args - 1.5 100 100 7 3
args - 2 40100 3 7
fuente
r
realmente 50 en todos tus ejemplos? Eso significaría que el rodillo da vueltas 50 veces.RotatingPolygonsGolfed
en el código "golfed" mientras está soloRotatingPolygons
en el código normal. ;)Javascript, 1284 caracteres (-200 = 1084 caracteres)
El código minimizado es
El código completo es
Un violín para contemplar la rutina en toda su gloria poligonal (y para demostrar la animación) se encuentra en
http://jsfiddle.net/7rv751jy/2/embedded/result/
El script define una función llamada
epi
que acepta los cinco parámetros enumerados en el OP.epi
devuelve una función con la firma(e,t,isCCW,flags)
que acepta argumentos:e
- una referencia a un elemento de lienzo HTML5 de 600x600 en el que representart
- el ángulo total (en radianes) que el centroide del segundo polígono debe barrer alrededor del centroide del primero. El argumento pasado no debe exceder 2 pi veces el número de rotaciones pasadoepi
.isCCW
- booleano que indica si la traza debe proceder en el sentido contrario a las agujas del reloj (en lugar de en sentido horario)flags
- un conjunto de banderas de bits que indican qué elementos deben representarseLa función se puede llamar cualquier número de veces con diferentes conjuntos de argumentos.
Algunas notas:
La rutina maneja los casos degenerados donde
n1 = 2
y / on2 = 2
. Al animar, ciertas combinaciones de longitudes causarán avances rápidos repentinos en la traza. Esto se debe a que los cuadros de animación están indexados por el ángulo del centroide del segundo polígono, y d theta poly2 / d theta centroid se vuelve singular en los casos en que el centroide de 2 lados poli 2 está cerca de un vértice de 2 lados poli 1 Sin embargo, esto no afecta la traza.Los nombres de los parámetros en
epi
parecerán confusos ya que durante todo el desarrollo, me referí al polígono 1 como "2" y al polígono 2 como "1". Cuando me di cuenta de la inconsistencia entre mi convención y la del OP, en lugar de intercambiar todos los índices en el código, simplemente cambié el orden de los argumentosepi
.El violín anterior importa jQuery, pero esto es para manejar la interfaz de usuario. La
epi
función no tiene dependencias de biblioteca.El código maneja los rastros CCW simplemente invirtiendo el eje Y. Esto es algo poco elegante ya que el polígono 2 comienza en una posición invertida en Y durante las trazas CCW, pero nadie dijo que la rutina tenía que ser elegante. ;)
fuente
nt = ~~(t*(r_>rC?r_:rC)+1)
dent = ~~(t*(r_>rC?r_:rC)/10+1)
y debe acelerar un poco las cosas.