Um epiciclóide é a curva que um ponto em um círculo faz ao girar em torno de outro círculo. Um ciclogon é a forma que um ponto em um polígono regular faz ao rolar através de um plano. Um epiciclogon é a curva traçada por um ponto em um polígono regular enquanto ele gira em torno de outro.
Escreva um programa que desenha uma 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
- Quando
r
negativo, o rolo deve girar no sentido anti-horário . - Pois
r
, uma revolução ocorre quando a linha que liga os centróides das duas formas varre 360 graus. Essa noção é expandida para incluir todos os valores der
. (Então, em um quarto de revolução, a linha que liga os centróides varre 90 graus.) - Esses argumentos devem vir da linha de comando ou o seu programa deve solicitá-los (por exemplo, no Python
input()
). r1
er2
são relativos um ao outro, não às dimensões da imagem. Assim, você pode definir uma "unidade" para qualquer número de pixels reais.
O ponto que você deve traçar é um dos vértices da forma rotativa. As formas devem começar com esse vértice tocando um vértice estacionário e dois lados adjacentes:
Os vértices iniciais exatos e o ângulo do polígono estacionário não importam.
Saída
A saída deve ir para uma imagem com pelo menos 600x600 pixels (ou alguma dimensão variável que pode ser definida como 600). Ele deve mostrar toda a curva epiciclogônica especificada pelos parâmetros, bem enquadrada na imagem.
Os polígonos rolantes e estacionários também devem ser desenhados (com o rolo em seu estado final). As duas formas e o epiciclogon devem ter três cores visivelmente diferentes.
Também deve haver uma maneira simples de não desenhar os polígonos ( basta uma alteração de true
para false
no código).
Por favor, mostre-nos pelo menos 2 imagens de saída. Não há problema em encolhê-los, se necessário.
Pontuação
O código mais curto que produz imagens de saída válidas vence.
Bónus
- Menos 50 bytes se a saída for um gif animado (ou semelhante) da curva que está sendo desenhada.
- Menos 150 bytes, se você deixar
n1
en2
pegar o valor 2, para que as formas se tornem segmentos de linha de comprimento2 * r1
(our2
), "rolando" entre si. A forma como você lida comr
quandon1
en2
tem 2 é com você, uma vez que os centróides não giram em torno um do outro, da mesma forma que em outros casos. (Não "rolar" não conta como manipulá-lo.)
Como estou ansioso para ver essa idéia inovadora executada bem (e não é exatamente uma caminhada), vou premiar 150 representantes de recompensa ao vencedor. O concurso terminará no mesmo dia em que a recompensa acabar.
A recompensa não será concedida ao vencedor se estiver claro que ele simplesmente reescreveu a maior parte do código de outro envio.
As funções de biblioteca que já fazem isso (se houver) não são permitidas.
Nota: Isso veio das minhas perguntas restantes que qualquer pessoa é livre para postar. Mas se ninguém mais os publicar, há uma boa chance de que eu a tempo. : P
fonte
Respostas:
MATLAB: 735 bytes - 200 bônus = 535
Meu programa lida com o caso n = 2 e desenha uma animação em tempo real. Existem algumas diferenças entre as versões com e sem golf:
A versão ungolfed tem apenas uma opção para salvar a animação em um arquivo 'g.gif', configurando
savegif = 1
no código. Está desativado por padrão, pois pode ser irritante por alguns motivos:A economia de gif teve que ser eliminada na versão em golf, pois demorava cerca de 100 bytes, excedendo o tamanho do bônus.A versão ungolfed desenha um círculo no vértice do marcador. Também produz mais quadros e move-se mais rapidamente (embora isso possa ser ajustado na versão golfed alterando os números).
Amostras:
f(11,5,90,2,99,0)
após o término do programaepic(1.3,4,2,6,6,1)
com saída gifCódigo ungolfed
Código de golfe
Instruções:
Salve a função em um arquivo com o mesmo nome,
epic.m
ou seja, ouf.m
. Execute-o chamando a função no console do Matlab.Uso:
epic(r, r1, r2, n1, n2, dispPoly)
ondedispPoly
é uma variável booleana (zero se falso, um número diferente de zero se verdadeiro) determinando se os polígonos serão desenhados.Edit: Adicionado bônus de 50 por imagem animada.
fonte
Java -
2.7262.634 - 200 = 2434 caracteresAprimorado de 3800 bytes ish
Obrigado a todos por suas sugestões (especialmente o pseudônimo117), aqui está a nova versão.
Eu adicionei uma classe P, que é a classe point e uma classe L, que estende ArrayList
Também adicionei algumas pequenas alterações lógicas.
Aqui está a classe principal (não jogada de golfe):
E a versão do golfe:
Bem como as classes P:
E eu:
Altere int d para 0 ou 1 para mostrar polígonos
argumentos - 1 100 50 5 2
args - 1,5 100 100 7 3
args - 2 40 100 3 7
fonte
r
realmente 50 em todos os seus exemplos? Isso significaria que o rolo gira cerca de 50 vezes.RotatingPolygonsGolfed
no código "golfed", enquanto está apenasRotatingPolygons
no código normal. ;)Javascript, 1284 caracteres (-200 = 1084 caracteres)
O código reduzido é
O código completo é
Um violino para contemplar a rotina em toda a sua glória poligônica (e demonstrar animação) é encontrado em
http://jsfiddle.net/7rv751jy/2/embedded/result/
O script define uma função chamada
epi
que aceita os cinco parâmetros listados no OP.epi
retorna uma função com a assinatura(e,t,isCCW,flags)
que aceita argumentos:e
- uma referência a um elemento de tela HTML5 de 600 x 600 no qual renderizart
- o ângulo total (em radianos) que o centróide do segundo polígono deve varrer em torno do centróide do primeiro. O argumento passado não deve exceder 2 pi vezes o número de rotações passadasepi
.isCCW
- booleano indicando se o rastreio deve prosseguir no sentido anti-horário (em oposição ao sentido horário)flags
- um conjunto de sinalizadores de bit indicando quais elementos devem ser renderizadosA função pode ser chamada inúmeras vezes com conjuntos variados de argumentos.
Algumas notas:
A rotina lida com os casos degenerados em que
n1 = 2
e / oun2 = 2
. Ao animar, certas combinações de comprimentos causam avanços rápidos repentinos no traço. Isso ocorre porque os quadros de animação são indexados pelo ângulo em relação ao centróide do segundo polígono, e d teta poli2 / d teta centróide se torna singular nos casos em que o centróide de poli 2 lados está próximo de um vértice de poli 1 lados. Isso não afeta o rastreamento, no entanto.Os nomes dos parâmetros em
epi
parecerão confusos, pois ao longo do desenvolvimento, me referi ao polígono 1 como "2" e ao polígono 2 como "1". Quando percebi a inconsistência entre minha convenção e a do OP, em vez de trocar todos os índices no código, simplesmente troquei a ordem dos argumentosepi
.O violão acima importa o jQuery, mas é para lidar com a interface do usuário. A
epi
função não possui dependências de biblioteca.O código lida com traços no sentido anti-horário simplesmente invertendo o eixo Y. Isso é um tanto deselegante, pois o polígono 2 começa na posição invertida em Y durante os traçados CCW, mas ninguém disse que a rotina tinha que ser elegante. ;)
fonte
nt = ~~(t*(r_>rC?r_:rC)+1)
parant = ~~(t*(r_>rC?r_:rC)/10+1)
e ele deve acelerar um pouco as coisas.