Polígonos espirales

8

ingrese la descripción de la imagen aquí

Dibuja una serie de polígonos conectados como el que se muestra arriba.

Sin embargo, lo que la imagen de arriba no muestra es la espiral formada por vértices consecutivos:

ingrese la descripción de la imagen aquí

La limitación de estos es que solo hay 1 espiral marcada. Debes marcar todas las espirales. Esto se puede hacer girando cada espiral que se muestra arriba para que haya una espiral que comience en cada vértice del polígono más grande.

Todas las espirales deben ser de un color, mientras que el resto de la imagen es de otro.

El polígono más interno debe ser completamente del color de la espiral.

Reglas

  • Recibirá los argumentos {n, s, p, a} en una función o programa
  • n = iteraciones hacia adentro (número de polígonos)
  • s = lados del polígono (regular) (puede suponer n> = 3)
  • p = (la distancia lineal desde un vértice del polígono A a su correspondiente vértice "interno" en sentido antihorario) / (la longitud total del lado de A). Entonces, para el diagrama, p sería aproximadamente 1/3 porque cada polígono interno se encuentra con el lado del polígono más grande a aproximadamente 1/3 del camino a través de ese lado.
  • a = el radio (circunscripción) del polígono exterior

El límite de cualquiera de los valores de n, s, po a se basa en lo que un humano puede percibir como este tipo de dibujo. (por ejemplo, sin círculos sombreados), así como el sentido común (s> = 3, n> = 1)

¡Feliz golf! El programa más corto gana.

Estiramiento Maniaco
fuente
1
¿Es el parámetro plineal en ángulo o en distancia entre dos vértices?
TheSpanishInquisition
Perdón por la confusión, espero que las ediciones aclaren las cosas.
Stretch Maniac
Debe colorearlo de un color diferente al de las otras líneas. Por lo tanto, cada lado tendrá 2 colores, uno que lo atraviesa y el otro un color diferente.
Stretch Maniac
@ MartinBüttner Creo que quiere decir que todas las espirales (la porción en el sentido de las agujas del reloj de todos los lados) deberían ser de un color de resaltado (como el rojo) y el resto del lado debería ser el color de primer plano básico (como el negro). Esto daría sespirales rojas en sentido antihorario . Sin embargo, ¡lo que queda serían espirales negras en s sentido horario ! StretchManiac, esta es una buena pregunta, pero realmente necesitamos una imagen de ejemplo para ver a qué te refieres. Upvoting y closevoting.
Level River St
Votación abierta, aunque sería útil confirmar si el polígono más interno debería llenarse (entiendo que no debería)
Level River St

Respuestas:

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 la entrada como una matriz como se define en la pregunta, por ejemplo {20, 7, 0.5, 100}:

ingrese la descripción de la imagen aquí

o {20, 5, 0.333, 100}

ingrese la descripción de la imagen aquí

Estas imágenes todavía usan rojo y gris de una versión anterior, pero la nueva versión usa negro para las espirales en sentido antihorario y rojo para el resto.

He incluido un eje, porque de lo contrario el aparámetro no tiene sentido con un gráfico vectorial. También he interpretado pcomo una interpolación lineal en posición, no en ángulo.

Sin golf:

{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
fuente