Polígonos em espiral

8

insira a descrição da imagem aqui

Desenhe uma série de polígonos conectados como o mostrado acima.

No entanto, o que a figura acima não mostra é a espiral formada por vértices consecutivos:

insira a descrição da imagem aqui

A limitação disso é que há apenas 1 espiral marcada. Você deve marcar todas as espirais. Isso pode ser feito girando cada espiral mostrada acima, para que haja uma espiral iniciando em cada vértice do maior polígono.

As espirais devem ser de uma cor, enquanto o restante da imagem, outra.

O polígono mais interno deve ser inteiramente da cor da espiral.

Regras

  • Você receberá os argumentos {n, s, p, a} em uma função ou programa
  • n = iterações internas (número de polígonos)
  • s = lados do polígono (regular) (você pode assumir que n> = 3)
  • p = (a distância linear de um vértice do polígono A ao correspondente vértice "interno" no sentido anti-horário) / (o comprimento total do lado de A). Portanto, para o diagrama, p seria de cerca de 1/3, porque cada polígono interno encontra o lado do polígono maior a cerca de 1/3 do caminho através desse lado.
  • a = raio (circunscrição) do polígono externo

O limite de qualquer um dos valores de n, s, p ou a é baseado no que pode ser percebido como esse tipo de desenho por um humano. (por exemplo, sem círculos sombreados), além do senso comum (s> = 3, n> = 1)

Feliz golfe! O programa mais curto vence.

Stretch Maniac
fonte
1
O parâmetro é plinear em ângulo ou em distância entre dois vértices?
TheSpanishInquisition
Desculpe a confusão, espero que as edições esclareçam as coisas.
Stretch Maniac
Você deve colorir uma cor diferente das outras linhas. Portanto, cada lado terá 2 cores - uma que passa por ela e o restante uma cor diferente.
Stretch Maniac
@ MartinBüttner Acho que ele quer dizer que todas as espirais (a parte horária de todos os lados) devem ter uma cor de destaque (como vermelho) e o restante do lado deve ter a cor básica de primeiro plano (como preto). Isso daria sespirais vermelhas no sentido anti-horário . No entanto, o que resta seriam espirais negras s no sentido horário ! StretchManiac, esta é uma boa pergunta, mas realmente precisamos de uma imagem de exemplo para entender o que você quer dizer. Voto positivo e voto fechado.
Level River St
Openvoting, apesar de que seria útil para confirmar se o polígono mais interna deve ser preenchido (eu entendo que não deveria.)
Nível River St

Respostas:

13

Mathematica, 218 206 bytes

{n,s,p,a}=Input[];t=0;Graphics[(c=Array[a{Cos[u=t+2Pi#/s],Sin@u}&,s+1];m=(f=p#2+(1-p)#&)@@c;a=Norm@m;t=ArcTan@@m;k=#;{Line@{#,x=f@##},If[k<n,Red],Line@{x,#2}}&@@@Thread@{c,RotateLeft@c})&~Array~n,Axes->1>0]

Espera a entrada como uma matriz, conforme definido na pergunta, por exemplo {20, 7, 0.5, 100}:

insira a descrição da imagem aqui

ou {20, 5, 0.333, 100}

insira a descrição da imagem aqui

Essas imagens ainda usam vermelho e cinza de uma versão anterior, mas a nova versão usa preto para as espirais no sentido anti-horário e vermelho para o resto.

Eu incluí um eixo, porque, caso contrário, o aparâmetro não terá sentido em um gráfico vetorial. Também interpretei pcomo uma interpolação linear na posição, não no ângulo.

Ungolfed:

{n, s, p, a} = Input[];
t = 0;
Graphics[
 (
    c = Array[a {Cos[u = t + 2 Pi #/s], Sin@u} &, s + 1];
    m = (f = p #2 + (1 - p) # &) @@ c;
    a = Norm@m;
    t = ArcTan @@ m;
    k = #;
    {Line@{#, x = f@##}, If[k < n, Red], Line@{x, #2}} & @@@ 
     Thread@{c, RotateLeft@c}
    ) &~Array~n
 ,
 Axes -> 1 > 0]
Martin Ender
fonte