Mosaico, dada la configuración de vértice


11

Tarea

La tarea es colocar los polígonos en mosaico, dada una configuración de vértice.

Puntuación

Su puntaje es igual al "nivel de complejidad" que alcanza su envío. Los niveles de complejidad son acumulativos, lo que significa que para alcanzar el n. ° 3 también debe admitir los n. ° 1 y n. ° 2.

Las presentaciones en un nivel de complejidad igual se distinguen por el recuento de bytes; victorias más bajas.

Entrada

La entrada es una cadena que contiene una configuración de vértice, que representa una figura de vértice. Es decir, una lista de enteros separados por puntos, donde cada entero (n) representa un n-gon regular, conectado por un vértice común.

Se deben admitir las siguientes configuraciones de vértices:

  • 3.3.3.3.3.3
  • 3.3.3.3.6
  • 3.3.3.4.4 (tenga en cuenta que el orden se refleja en la figura del vértice, por lo tanto, el siguiente es diferente)
  • 3.3.4.3.4
  • 3.12.12
  • 3.4.6.4
  • 3.6.3.6
  • 4.4.4.4
  • 4.6.12
  • 4.8.8
  • 6.6.6

Salida - Nivel de complejidad # 1: Figura de vértice

En este nivel de complejidad, la salida es una imagen que muestra la figura del vértice correspondiente a la entrada dada.

La entrada se antepone con un Fsímbolo para indicar que la figura del vértice debe salir, y no el mosaico completo.

Por ejemplo F3.6.3.6da esta figura de vértice:

3.6.3.6 figura de vértice

Salida - Nivel de complejidad # 2: Mosaico

En este nivel de complejidad, la salida es una imagen que muestra un mosaico uniforme utilizando la figura del vértice correspondiente a la entrada dada.

Por ejemplo 3.6.3.6da este mosaico:

3.6.3.6 mosaico

No hay restricciones de color o formato (salvo lagunas).

Salida - Nivel de complejidad # 3: Mosaico dual

En este nivel de complejidad, se puede formar un 'mosaico dual' a partir de cada mosaico. Esto se logra dibujando líneas desde el centro de cada polígono hasta el centro de cada polígono limítrofe.

El mosaico dual se especifica anteponiendo la entrada con a V.

Por ejemplo V3.6.3.6da este doble mosaico (en rojo):

Mosaico V3.6.3.6


Algunas de estas inclinaciones tienen sinónimos. Por ejemplo, los siguientes son todos iguales: 3.3.3.4.4 3.3.4.4.3 3.4.4.3.3 4.4.3.3.3 4.3.3.3.4. ¿Tenemos que admitir todos los sinónimos, o solo el léxico más bajo (como se indica en la pregunta)? Además, 3.3.3.3.6existe en dos formas de imagen espejo. Entiendo que cualquiera es aceptable.
Level River St el

La página que vinculó no coincide con la lista dada. 3.3.3.4.4falta por ejemplo. en.wikipedia.org/wiki/… coincide exactamente con su lista. Entiendo que los polígonos de contorno o rellenos son aceptables (¿o una combinación de los dos?) Algunos duales ya están en la lista. Por ejemplo, 4.4.4.4es su propio dual 3.3.3.3.3.3y 6.6.6son mutalmente duales. Como los duales se muestran independientemente de sus padres, entiendo que no hay necesidad de una alineación correcta con los padres.
Level River St

debe admitir la entrada tal como aparece en la lista; puede admitir sinónimos pero no tiene que hacerlo; debe admitir todos los duales, incluso los duales.
jsh

contorno / relleno - bien de cualquier manera. se permite cualquier estilo además de las lagunas (haga que todo sea blanco, haga que el área de dibujo sea pequeña, etc.). No se requiere alineación. Podría decirte que no puedes usar un solo reflejo, 3.3.3.3.6pero ¿cómo saber cuál es? :)
jsh

Ahora que ha cambiado la puntuación, ¿cuál es el desempate? ¿Sigue siendo el código más corto? Si es así, ¿las configuraciones de vértice tienen que estar delimitadas por puntos o podemos elegir otro símbolo como coma o espacio?
Level River St el

Respuestas:


9

BBC BASIC

Rev 1 Código de golf, 655 caracteres ASCII, tamaño de archivo tokenizado 614

Algunas mejoras importantes en la tabla de datos, al dividir la cadena A.B..Nen un número (1*A+2*B+..n*N)+nantes de buscar, y al almacenar solo un vector de traducción (el otro es generado por el código). Más explicaciones cuando haya terminado de jugar golf.

t=PI*2DIMm(9)
c=0z=0INPUTz$
FORi=1TOLEN(z$)d%=VAL(MID$(z$,i))IFd%c+=1m(c)=d%i-=d%=12z+=c*d%
NEXTREPEATREADl,e,f
UNTILl=z+c
l=4-3*(m(3)MOD3=0)-8*(l=59)
DATA69,0,70,65,100,35,66,149,0,49,109,0,52,80,0,55,0,189,39,120,0,44,40,40,58,55,95,47,136,0,59,40,0
VDU23,23,3|
FORr=-9TO19FORs=-9TO9a=1+e*(r*2+s)-f*l*s/4b=1+f*(r*2+s)+e*l*s/4p=40q=0FORk=1TOm(c)/2FORj=1TOc
n=m(j)o=TAN(PI/3)IFe=109ANDn<>4o=1
w=-p*COS(t/n)-q*SIN(t/n)q=p*SIN(t/n)-q*COS(t/n)p=w
u=p:v=q
x=a:y=b
MOVEx,y
FORi=1TO14x+=u*2y+=v*2IFVAL(z$)DRAWx,y ELSEGCOL9LINEx-u-v/o,y-v+u/o,x-u+v/TAN(PI/n),y-v-u/TAN(PI/n)
w=v*COS(t/n)-u*SIN(t/n)u=v*SIN(t/n)+u*COS(t/n)v=w
NEXTNEXT
p=u:q=v
a=x:b=y
NEXTNEXTNEXT

Rev 0 Código de golf, 770 caracteres ASCII, tamaño de archivo tokenizado 728

Todo lo que he hecho aquí es eliminar comentarios, espacios en blanco innecesarios y comillas, y poner todo DATAen una línea. Ciertamente hay espacio para más golf.

t=PI*2DIMm(9)
c=0INPUTz$
FORi=1TOLEN(z$)d%=VAL(MID$(z$,i))IFd%c+=1:m(c)=d%:i-=d%=12
NEXTREPEATREADl$,e,f,g,h
UNTILMID$(z$,1-(VAL(z$)=0))=l$
DATA3.3.3.3.3.3,240,0,120,70,3.3.3.3.6,200,70,40,210,3.3.3.4.4,80,0,40,150,3.3.4.3.4,-40,150,150,40,3.12.12,300,0,150,260,3.4.6.4,220,0,110,188,3.6.3.6,160,0,80,140,4.4.4.4,80,0,0,80,4.6.12,0,380,330,-190,4.8.8,272,0,136,136,6.6.6,240,0,120,70
VDU23,23,3|
FORr=-9TO19 FORs=0TO9a=1+e*r+g*s
b=1+f*r+h*s
p=40q=0FORk=1TOm(c)/2FORj=1TOc
n=m(j)o=TAN(PI/3):IFe=220ANDn<>4o=1
w=-p*COS(t/n)-q*SIN(t/n)q=p*SIN(t/n)-q*COS(t/n)p=w
u=p:v=q
x=a:y=b
MOVEx,y
FORi=1TO14x+=u*2y+=v*2IFVAL(z$)DRAWx,y ELSEGCOL9LINEx-u-v/o,y-v+u/o,x-u+v/TAN(PI/n),y-v-u/TAN(PI/n)
w=v*COS(t/n)-u*SIN(t/n)u=v*SIN(t/n)+u*COS(t/n)v=w
NEXTNEXT
p=u:q=v
a=x:b=y
NEXTNEXTNEXT

Explicación

Esta es una continuación de mi respuesta anterior de Nivel 1, pero decidí publicarla por separado porque es bastante larga.

Nivel 2

Esto se logra mediante la traducción de mis plantillas de "nivel 1.5" de mi respuesta anterior. Los dos vectores de traducción para cada mosaico están codificados. Aprovecho el hecho de que un triángulo isósceles de base 80 y altura 70 es una muy buena aproximación de un triángulo equilátero, y un triángulo rectángulo con vector de hipotenusa (56,56)tiene una longitud de hipotenusa muy cercana a 80.

Nivel 3

Para trazar los duales, en lugar de trazar un borde del polígono, trazamos un radio desde el medio de ese borde hasta el centro del polígono. Esto está en ángulo recto con el borde y tiene una longitud de 1/TAN/(PI/n)veces del vector (u, v) que a su vez es la mitad del borde.

Desafortunadamente, debido a que ciertos polígonos en las inclinaciones 3.3.3.3.6y 3.4.6.4no se trazan explícitamente, no se trazarían si solo hiciéramos esto. Por lo tanto, el radio también se extiende hacia afuera desde el polígono. La extensión hacia el exterior está controlada por la variable o.

Por defecto, la extensión es suficiente para alcanzar el centro de un triángulo, pero para 3.4.6.4ello debe extenderse más para dibujar los duales de los cuadrados que no se trazan explícitamente. Por lo tanto, se aplica suficiente extensión para completar los cuadrados faltantes cuando los hexágonos y los triángulos se trazan explícitamente, pero la extensión normal se aplica cuando los cuadrados se trazan explícitamente, para evitar líneas espurias en los triángulos adyacentes.

Así es como se ven sin las extensiones de radios. Los agujeros en el patrón dual se pueden ver claramente. La salida correcta se puede ver en la imagen principal en la parte inferior de la respuesta

ingrese la descripción de la imagen aquí

Código comentado

Las diferencias con respecto a mi respuesta anterior se indican en línea.

  t=PI*2                                          :REM constant Tau = PI*2

  DIMm(9)                                         :REM declare array for the numbers in the input
  c=0                                             :REM number of polygons in the list

  INPUTz$
  FORi=1TOLEN(z$)                                 :REM for each character in the input
    d%=VAL(MID$(z$,i))                            :REM use VAL to return the numeric value of the substring to the right and store to integer variable
    IF d% c+=1 :m(c)=d%: i-=d%=12                 :REM if the last character read was a number, d% contains it, otherwise 0. Advance c and store to m. If it is 12, increment i to skip a character.
  NEXT

  REM BLOCK OF NEW CODE to define vectors (e,f) and (g,h) for each possible tiling

  REPEAT
    READ l$,e,f,g,h                               :REM read an entire line of the data below
  UNTIL MID$(z$,1-(VAL(z$)=0))=l$                 :REM abort the loop when l$ coincides with the input. the MID$ strips off the 'V' from the input where necessary.

  DATA"3.3.3.3.3.3",240,0,120,70
  DATA"3.3.3.3.6",200,70,40,210
  DATA"3.3.3.4.4",80,0,40,150
  DATA"3.3.4.3.4",-40,150,150,40
  DATA"3.12.12",300,0,150,260
  DATA"3.4.6.4",220,0,110,188
  DATA"3.6.3.6",160,0,80,140
  DATA"4.4.4.4",80,0,0,80
  DATA"4.6.12",0,380,330,-190
  DATA"4.8.8",272,0,136,136
  DATA"6.6.6",240,0,120,70

  VDU23,23,3|                                           :REM change linewidth to 3 (default is 1)

  REM END BLOCK OF NEW CODE

  FORr=-9TO19 FORs=0TO9                                 :REM two new loops for translations

      a=1+e*r+g*s                                       :REM modified code for
      b=1+f*r+h*s                                       :REM coordinates to start drawing at


      p=40:q=0                                          :REM vector of first line

      FORk=1TOm(c)/2                                    :REM draw half as many vertex figures as there are sides on the last polygon in the list

        FORj=1TOc                                       :REM for each polygon on the list
          n=m(j)                                        :REM n=number of sides
          o=TAN(PI/3): IF e=220 AND n<>4 o=1            :REM new code for the spoke extension 1/o. 

          w=-p*COS(t/n)-q*SIN(t/n)                      :REM rotate the starting vector anticlockwise by the internal angle of the current polygon
          q=p*SIN(t/n)-q*COS(t/n)                       :REM to avoid overlapping the previous one, if any.
          p=w

          u=p:v=q                                       :REM make a local copy of the vector and coordinates
          x=a:y=b                                       :REM to avoid corruption of p,q,a,b during the drawing of the polygon
          MOVE x,y                                      :REM move the graphics cursor to the start without drawing
          FORi=1TO14                                    :REM do 14 iterations regardless of the number of sides on the polygon
            x+=u*2                                      :REM increment x and y by the vector representing the side
            y+=v*2                                      :REM the value is double (u,v) to facilitate drawing duals later

            REM if z$ begins with a numeric character, draw an edge. If not, change to red and draw a spoke.
            IFVAL(z$) DRAW x,y ELSE GCOL9: LINEx-u-v/o,y-v+u/o,x-u+v/TAN(PI/n),y-v-u/TAN(PI/n)             

            w=v*COS(t/n)-u*SIN(t/n)                     :REM rotate the vector clockwise
            u=v*SIN(t/n)+u*COS(t/n)                     :REM through the external angle of the polygon
            v=w
          NEXT                                          :REM draw next edge of the current polygon
        NEXT                                            :REM draw next polygon of the current vertex

        p=u:q=v                                         :REM once the vertex is finished, we will be two sides around the perimeter of the last polygon.
        a=x:b=y                                         :REM copy the position and direction data into p,q,a,b.
      NEXT                                              :REM draw next vertex figure

    NEXT                                                :REM close the two new translation loops
  NEXT

Salida

El programa realiza solo un mosaico o doble para cada ejecución. Sin embargo, traza los duales en rojo. Para ahorrar espacio, ejecuté el programa dos veces sin borrar la pantalla para superponer el dual encima del mosaico normal.

ingrese la descripción de la imagen aquí


8

Mathematica

El nivel 1 contiene las plantillas de mosaico básicas que se estampan repetidamente para mosaico de un plano.

El nivel 2 hace el mosaico.

Todavía hay 2 inclinaciones que no he podido lograr. Parecen requerir rotación así como traslación.

Nivel 1: Figura de Vértice (559 bytes)

nGon[n_]:=
{ColorData[46,"ColorList"][[n]],Polygon@Switch[n,
3,{{0,0},{-1/2,.866},{-1,0},{0,0}},
4,{{0,0},{0,1},{-1,1},{-1,0},{0,0}},
6,Table[{Cos[i 2Pi/n],Sin[i 2Pi/n]}+{-.5,.866},{i,0,n}],
8,Table[1.31{Cos[i Pi/4],Sin[i Pi/4]}+{-0.5`,1.207},{i,1/2,9}],
_,Table[2{Cos[i 2Pi/n],Sin[i 2Pi/n]}+{-0.5176,1.932},{i,1/2,13}]]}
innerAngle[n_]:=180-360/n
g[{}]=0;
g[a_]:=-(Plus@@innerAngle/@a)

h[{{},__,out_}]:=out
h[{list_,angles_,out_}]:=(
z=GeometricTransformation[nGon[l=list[[1]]],RotationTransform[g[angles] Degree]];
h[{Rest@list,Append[angles,l],Append[out,z]}])

Pruebas

Row[Graphics[{EdgeForm[{Blue}], #}, 
      ImageSize -> 70] & @@ {h[{#, {}, {}}]} & /@ {{3, 3, 3, 3, 3, 
    3}, {3, 3, 3, 3, 6}, {3, 3, 3, 4, 4}, {3, 3, 4, 3, 4}, {3, 12, 
    12}, {3, 4, 6, 4}, {3, 6, 3, 6}, {4, 4, 4, 4}, {4, 6, 12}, {4, 8, 
    8}, {6, 6, 6}}]

sellos


Nivel 2: Mosaico (690 bytes adicionales)

Las reglas devuelven compensaciones de mosaico y sangrías para cada configuración.

r es la función básica que genera las inclinaciones.

pmuestra la plantilla y el mosaico respectivo. Los espacios en blanco corresponden a aquellos no cubiertos por la plantilla.

rules={
{3,6,3,6}-> {2,3.47,0,0},
{4,4,4,4}-> {1,1,0,0},
{6,6,6}-> {3,2.6,1.5,0},
{3,3,3,3,3,3}-> {1.5,1.74,0,.9},
{3,3,3,3,6}-> {2,2.6,-0.4,1.8},

{4,6,12}->{4.2,4.9,0,2.5},
{3,3,4,3,4}-> {1.87,1.86,-.5,-0.5},
{4,8,8}-> {3.4,3.4,0,0},
{3,3,3,4,4}-> {2,1.87,.52,0},
{3,12,12}-> {3.82,6.73,0,0},
{3,4,6,4}-> {1.4,4.3,0(*1.375*)-1,-2.4}};


r[nGons_]:=
Module[{horizHop,vertHop,indent,downIndent},
{horizHop,vertHop,indent,downIndent}=(nGons/.rules);
Graphics[{EdgeForm[{Blue}],Table[GeometricTransformation[h[{#,{},{}}]&/@{nGons},
TranslationTransform[{
If[MemberQ[{{3,3,4,3,4},{3,3,3,3,6},{3,4,6,4}},nGons],indent *row,indent Boole[OddQ[row]]]+col horizHop,
If[MemberQ[{{3,3,4,3,4},{3,3,3,3,6},{3,4,6,4}},nGons],downIndent *col,downIndent Boole[OddQ[col]]]-row vertHop}]],
{col,0,5},{row,0,4}]},ImageSize-> 250]]

p[nGon_]:=Row[{Graphics[{EdgeForm[{Blue}],h[{nGon,{},{}}]},ImageSize->70],r@nGon}];

Pruebas

Mosaico triangular

p[{3, 3, 3, 3, 3, 3}]

triangular


hexagonal

p[{6, 6, 6}]

hexagonal


cuadrado

p[{4, 4, 4, 4}]

cuadrado


desconocido

p[{3, 3, 4, 3, 4}]

archimedes1


cuadrado truncado

p[{4, 8, 8}]

cuadrado truncado


trihexagonal

p[{3, 6, 3, 6}]

trihexagonal


hexagonal truncado

p[{3, 12, 12}]

hexagonal truncado


sin nombre

p[{3, 3, 3, 3, 6}]

inclinado


triangular alargado

p[{3, 3, 3, 4, 4}]

triangular alargado


Inclinaciones para descubrir

izquierda


Estoy más o menos en la misma etapa que tú. Puedo crear los mosaicos, pero resolverlos será un poco difícil. El wiki steveverill publicado en sus comentarios hace que parezca que varios esquemas realizados deben ser compatibles. Necesito hacer un poco de estudio :)
MickyT

Micky, el desplazamiento vertical y horizontal de un mosaico dependerá del número de fila, el número de columna. usando compensaciones únicas para el caso en cuestión. Los estoy resolviendo uno por uno y luego los generalizaré.
DavidC

@DavidCarraher buen comienzo. He realizado un cambio en los criterios de puntuación que pueden afectarlo.
jsh

¡Bien hasta ahora! Si reduce su traslación horizontal a la 3.3.3.3.3.3mitad, de modo que las unidades se superpongan, puede deshacerse de esos diamantes y arreglar ese mosaico. Todavía tienes más que hacer 3.3.3.3.6, 3.4.6.4y 4.6.12sin embargo.
Level River St

Re 4.6.12 anyone know what it should look like?- Todas las inclinaciones requeridas están en en.wikipedia.org/wiki/… . Vea mi comentario sobre la pregunta. Esta es una página diferente a la mencionada en la pregunta. Pero 4.6.12también se muestra en esa página de todos modos.
Level River St

6

R

Paso 1

Aquí está mi esfuerzo para construir los azulejos. Azulejos para venir a continuación. Esto no valida la entrada, por lo que los inválidos dibujarán algunos mosaicos extraños. La entrada se escribe después de la primera línea

i=as.numeric(unlist(strsplit(readline(),"[.]")))
e=c()
for(n in 1:length(i)){
    o=sum(c(0,180-360/i[1:n-1]))
    for(z in 1:i[n]){
        e=c(e,(360/i[n])*(z-1)+o)
    }
}
f=pi/180
plot(c(0,cumsum(sin(e*f))),c(0,cumsum(cos(e*f))),type="l")

ingrese la descripción de la imagen aquí

Paso 1, 2 y 3: 1898

Finalmente volví a eso. La mayor parte de esto se trata de establecer compensaciones y manejar casos especiales :). Editar: la bandera V para los duales ahora se maneja

El proceso general es:

  • Toma la entrada y haz una lista
  • Crea una lista de ángulos para dibujar el mosaico inicial
  • Calcule los centros de cada polígono en el mosaico y los vectores de ellos para bisecar los bordes
  • Determine el conjunto de mosaicos que se está dibujando y haga una lista de desplazamientos de ángulo. Algunas baldosas tienen polígonos adicionales agregados para ayudar a llenar los agujeros.
  • Dibujar los azulejos
  • Dibuja los duales

Probablemente todavía pueda jugar golf un poco más.

##Get input (Enter by itself then type in the tile scheme)
i=strsplit(readline(),"[.]")[[1]]
## Run once i is set
q=0
if(substr(i[1],1,1)=="V"){q=1;i[1]=substr(i[1],2,9)}
i=as.numeric(i)
f=pi/180
e=x=y=q=p=c()
l=length(i)
d=1/(2*tan(pi/3))
g=1/(2*sin(pi/3))
for(n in 1:l){o=sum(c(0,180-360/i[1:n-1]))
r=1/(2*sin(pi/i[n]))
a=o+(180-360/i[n])/2
b=1/(2*tan(pi/i[n]))+d
for(z in 1:i[n]){x=c(x,r*sin(a*f))
y=c(y,r*cos(a*f))
q=c(q,b)
p=c(p,(360/i[n])*(z-1)+o-90)
e=c(e,(360/i[n])*(z-1)+o)}}
if(sum(i)==18&l==6){h=c(60,0);w=c(60,120)}
if(sum(i)==18&l==5){h=c(0,0,60);w=c(60,120,60)
e=c(e,0,-60,60,180,60,180)
x=c(x,g*sin(-30*f),g*sin(-30*f),g*sin(90*f))
y=c(y,1+g*cos(-30*f),1+g*cos(-30*f),1)
q=c(q,d+d,d+d,d+d)
p=c(p,-30,90,-30)}
if(sum(i)==17&l==5&sum(abs(diff(c(i,i[1]),1)))==2){h=c(0,0);w=c(90,60)}
if(sum(i)==17&l==5&sum(abs(diff(c(i,i[1]),1)))==4){h=c(0,30);w=c(270,300)}
if(sum(i)==17&l==4){h=c(0,30,-30);w=c(60,30,90)
e=c(e,150,120,210,300)
x=c(x,sin(150*f)+g*sin(90*f),sin(150*f)+sin(210*f)/2)
y=c(y,cos(150*f)+(1/(2*cos(pi/3)))*cos(90*f),cos(150*f)+cos(210*f)/2)
q=c(q,1,1)
p=c(p,210,120)}
if(sum(i)==18&l==4){h=c(0,0);w=c(120,120)}
if(sum(i)==16&l==4){h=c(0,0);w=c(90,90)}
if(sum(i)==27&l==3){h=c(0,-30,0,30);w=c(60,90,120,150,180)}
if(sum(i)==22&l==3){h=c(0,-30,30,90,60,30)
w=c(90,150,120,90,60,30)
e=c(e,0,-30,-60,30,120,210,30,90,150)
q=q-d+1/(2*tan(pi/4));q[13]=q[17]=q[21]=q[21]+3}
if(sum(i)==20&l==3){h=c(0,-45,-90);w=c(90,0,45)}
if(sum(i)==18&l==3){h=c(0,60,0,-60);w=c(0,60,120,60)}
hx=sum(sin(h*f))
hy=sum(cos(h*f))
wx=sum(sin(w*f))
wy=sum(cos(w*f))
plot(0,0,type="n")
par(pin=c(5,5),usr=c(0,20,0,20))
for(c in -20:20){for(j in -20:20){lines(c((c*hx)+(j*wx)+0,(c*hx)+(j*wx)+cumsum(sin(e*f))),c((c*hy)+(j*wy)+0,(c*hy)+(j*wy)+cumsum(cos(e*f))),type="l")
if(q){for(n in 1:length(x)){lines(c((c*hx)+(j*wx)+x[n],(c*hx)+(j*wx)+x[n]+q[n]*sin(p[n]*f)),c((c*hy)+(j*wy)+y[n],(c*hy)+(j*wy)+y[n]+q[n]*cos(p[n]*f)),col="RED")}}}}

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí


Wow, solo 4 horas detrás de mí. ¡Y también se ven bien, +1! ¿Ya tienes todos los casos funcionando?
Level River St el

@steveverrill Gracias y funciona para todos los casos en la pregunta.
MickyT

4

BBC BASIC

Descargue el emulador en http://www.bbcbasic.co.uk/bbcwin/bbcwin.html

Nivel 1

ingrese la descripción de la imagen aquí

Nivel 1.5

El nivel 1.5 es mi propia designación, pero es un hito importante en mi método.

La traducción de las figuras de vértice no siempre conduce al mosaico correcto. En algunos casos faltan líneas.

Mi solución a esto es rodear el polígono más grande, dibujando la figura del vértice para cada segundo vértice de ese polígono. Esta es una solución general para todos los casos. Tenga en cuenta que el polígono más grande siempre tiene un número par de lados y la figura del vértice a menudo alterna en sentido horario / antihorario a medida que avanza por el polígono. Esto se puede ver más claramente con 4.6.12, pero también es cierto de 4.8.8y 3.12.12: cuando se ve desde cualquier 8-gon o 12-gon en particular, los vértices alternos son imágenes especulares entre sí. Esto también es lo que está sucediendo, algo menos obvio, con 3.3.3.4.4y 3.3.4.3.4: cuando se ve desde un cuadrado en particular, los vértices alternos son imágenes especulares entre sí.

El algoritmo que uso para mover 2 lados alrededor del polígono es hacer siempre 14 iteraciones del ciclo de dibujo de bordes, independientemente de cuántos bordes tenga el polígono. 8 es un factor de 16, por lo tanto, al dibujar octágonos, el cursor gráfico termina 16-14 = 2 vértices detrás de donde comenzó. 3- 4- 6- y 12- gons tienen lados que son factores de 12, por lo que el cursor gráfico termina 14-12 = 2 vértices delante de donde comenzó.

Las figuras se pueden ver a continuación. Mañana espero resolver las traducciones correctas para completar el mosaico. En todos los casos, se dibujan suficientes líneas para completar el nivel 2 solo con traducciones. En algunos casos, se dibuja mucho más que el mínimo requerido, pero no hay problema con la superposición: las reglas no dicen nada sobre dibujar líneas solo una vez :-)

En general, el polígono más grande es el último en la lista. Desafortunadamente, hay un caso en el que esto no es así: por lo 3.4.6.4tanto, la figura dibujada en este caso se centra en un cuadrado en lugar de un hexágono. Hay suficientes líneas para completar el nivel 2 usando solo traducciones, aunque habrá ciertos cuadrados que no se dibujan explícitamente. Esto presentará algunos problemas en el nivel 3 (afortunadamente creo que sé cómo resolver esto). De manera similar, 3.3.3.3.6hay suficientes líneas para completar el nivel 2 usando solo traducciones, pero habrá ciertos triángulos que no se dibujan explícitamente.

ingrese la descripción de la imagen aquí

Código

El código para el nivel 1.5 está comentado, solo se activa el código para el nivel 1. Hay cuatro líneas que comienzan con a REM. Elimina estos REMs para activar el nivel 1.5.

  t=PI*2                                          :REM constant Tau = PI*2
  DIMm(9)                                         :REM declare array for the numbers in the input
  c=0                                             :REM number of polygons in the list

  INPUTz$
  FORi=1TOLEN(z$)                                 :REM for each character in the input
    d%=VAL(MID$(z$,i))                            :REM use VAL to return the numeric value of the substring to the right and store to integer variable
    IF d% c+=1 :m(c)=d%: i-=d%=12                 :REM if the last character read was a number, d% contains it, otherwise 0. Advance c and store to m. If it is 12, increment i to skip a character.
  NEXT

  FORi=1TOc PRINTm(i),:NEXT                       :REM parsing check for debugging.


  a=601:b=601                                     :REM coordinates to start drawing at
  p=40:q=0                                        :REM vector of first line

  REM FORk=1TOm(c)/2                              :REM draw half as many vertex figures as there are sides on the last polygon in the list

  FORj=1TOc                                       :REM for each polygon on the list
    n=m(j)                                        :REM n=number of sides

    w=-p*COS(t/n)-q*SIN(t/n)                      :REM rotate the starting vector anticlockwise by the internal angle of the current polygon
    q=p*SIN(t/n)-q*COS(t/n)                       :REM to avoid overlapping the previous one, if any.
    p=w

    u=p:v=q                                       :REM make a local copy of the vector and coordinates
    x=a:y=b                                       :REM to avoid corruption of p,q,a,b during the drawing of the polygon
    MOVE x,y                                      :REM move the graphics cursor to the start without drawing
    FORi=1TO14                                    :REM do 14 iterations regardless of the number of sides on the polygon
      x+=u*2                                      :REM increment x and y by the vector representing the side
      y+=v*2                                      :REM the value is double (u,v) to facilitate drawing duals later
      IFVAL(z$) DRAW x,y ELSE LINEx-u,y-v,x-u,y-v :REM if the first character of the input is a number, draw the side of the polygon. The ELSE part is unfinished and will be for drawing duals.
      w=v*COS(t/n)-u*SIN(t/n)                     :REM rotate the vector clockwise
      u=v*SIN(t/n)+u*COS(t/n)                     :REM through the external angle of the polygon
      v=w
    NEXT                                          :REM draw next edge of the current polygon
  NEXT                                            :REM draw next polygon of the current vertex

  REM p=u:q=v                                     :REM once the vertex is finished, we will be two sides around the perimeter of the last polygon.
  REM a=x:b=y                                     :REM copy the position and direction data into p,q,a,b.
  REM NEXT                                        :REM draw next vertex figure

Niveles 2 y 3

Mira mi otra respuesta.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.