Saltar al contenido

Representación gráfica del copo de nieve de Koch

Si hallas algún problema con tu código o trabajo, recuerda probar siempre en un ambiente de testing antes aplicar el código al proyecto final.

Solución:

MATLAB, 119 115

En un giro inusual de los acontecimientos, descubrí que este programa realmente funcionaba mejor mientras jugaba al golf. Primero, se volvió mucho más rápido debido a la vectorización. Ahora, muestra un aviso útil ~n:~ recordando al usuario qué cantidad ingresar!

Las nuevas líneas no son parte del programa.

x=exp(i*pi/3);
o='~n:~';
P=x.^o;
for l=2:input(o);
P=[kron(P(1:end-1),~~o)+kron(diff(P)/3,[0 1 1+1/x 2]) 1];
end;
plot(P)

n = 9:
n=9

o es un arbitrario string que es igual a [0 2 4 0] módulo 6. eiπ/3 elevado a estas potencias da los vértices de un triángulo equilátero en el plano complejo. El primero kron se utiliza para hacer una copia de la lista de puntos con cada uno duplicado 4 veces. ~~o es la forma conveniente de obtener un vector de 4 unidades. En segundo lugar diff(P) encuentra el vector entre cada par de puntos consecutivos. Múltiplos de este vector (0, 1/3, (1 + e-iπ/3)/3 y 2/3) se agregan a cada uno de los puntos anteriores.

LOGOTIPO: 95

to w:c ifelse:c=1[fd 2 lt 60][w:c-1 w:c-1 lt 180 w:c-1 w:c-1]end
to k:c repeat 3[w:c rt 180]end

Define función k con un solo parámetro de nivel.

Editar

En este editor en línea http://www.calormen.com/jslogo/ puede agregar k readword para usar el indicador de entrada, pero por alguna razón este comando no es compatible con la abreviatura estándar rw.

La solución de 102 caracteres a continuación funciona en USBLogo con entrada estándar como se especifica en la pregunta. Sin embargo, el código necesitaba pequeños cambios ya que UCBLogo tiene un analizador extraño. Requiere to y end estar en líneas y espacios separados antes : se requiere pero por otro lado : son opcionales.

to w c
ifelse c=1[fd 2 lt 60][w c-1 w c-1 lt 180 w c-1 w c-1]
end
to k c
repeat 3[w c rt 180]
end
k rw

T-SQL: 686 (excluyendo formato)

Para SQL Server 2012+.

Aunque esto nunca será un competidor, tenía que ver si podía hacerlo en T-SQL. Se acabó el enfoque de comenzar con los tres bordes iniciales, luego recurriendo a través de cada borde y reemplazándolos con 4 bordes para cada nivel. Finalmente uniendo todo en una sola geometría para el nivel especificado para @i

DECLARE @i INT=8,@ FLOAT=0,@l FLOAT=9;
WITH R AS(
    SELECT sX,sY,eX,eY,@l l,B,1i
    FROM(VALUES(@,@,@l,@,0),(@l,@,@l/2,SQRT(@l*@l-(@l/2)*(@l/2)),-120),(@l/2,SQRT(@l*@l-(@l/2)*(@l/2)),@,@,-240))a(sX,sY,eX,eY,B)
    UNION ALL
    SELECT a.sX,a.sY,a.eX,a.eY,l/3,a.B,i+1
    FROM R 
        CROSS APPLY(VALUES(sX,sY,sX+(eX-sX)/3,sY+(eY-sY)/3,sX+((eX-sX)/3)*2,sY+((eY-sY)/3)*2))x(x1,y1,x2,y2,x3,y3)
        CROSS APPLY(VALUES(x2+((l/3)*SIN(RADIANS(B-210.))),y2+((l/3)*COS(RADIANS(B-210.)))))n(x4,y4)
        CROSS APPLY(VALUES(x1,y1,x2,y2,B),
            (x3,y3,eX,eY,B),
            (x2,y2,x4,y4,B+60),
            (x4,y4,x3,y3,B-60)
        )a(sX,sY,eX,eY,B)
WHERE @i>i)
SELECT Geometry::UnionAggregate(Geometry::Parse(CONCAT('LINESTRING(',sX,' ',sY,',',eX,' ',eY,')')))
FROM R 
WHERE [email protected]

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

Agradecemos que quieras apoyar nuestra faena añadiendo un comentario o valorándolo te damos las gracias.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *