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