# =========================================================================== # # From: # # www.contextfreeart.org/gallery2/#design/3507 # # HEIGHT: 600 # WIDTH: 600 # # =========================================================================== #

startshape Scenary // (1600*1600) CF::Background=[b -1] CF::Impure=1 CF::Size=[s 1.9]

shape Scenary { Glow [s 1 a -1 z 0.01] // Assume Lightsource

CIRCLE [s 2 a -0.8]      // Create extra depth
Icosahedron []           // The polyhedron

} shape Glow { CIRCLE [h 50 sat 1 b 1]

Glow   [s 0.99 a 0.0004]

} //=============================================== // Create 20 triangles of the Icosahedron //=============================================== // 12 Vertices of the Icosahedron Phi=(1+sqrt(5))/2 Vi=(Phi,1,0), (-Phi,1,0), (-Phi,-1,0), (Phi,-1,0)

,(1,0,Phi), (1,0,-Phi), (-1,0,-Phi), (-1,0,Phi)
,(0,Phi,1), (0,-Phi,1), (0,-Phi,-1), (0,Phi,-1)

// Search Faces: Triples of Vertices shape Icosahedron {loop i1=0 ,12 [] { A=Vi

loop i2=i1+1,12 []  { B=Vi[3*i2,3]
 loop i3=i2+1,12 [] { C=Vi[3*i3,3]
  if (Len(A,B)+Len(B,C)+Len(C,A)<6.1)
    Triangle (A,B,C) []

}}}} //=============================================== // Rotate, Dilate, Project and Thicken Triangles //=============================================== shape Triangle (vector3 A, vector3 B, vector3 C) { Mr=Rot(Centroid(A, B, C))

Ap=Prj(Dil(Mr,Rot(A),0.85))
Bp=Prj(Dil(Mr,Rot(B),0.85))
Cp=Prj(Dil(Mr,Rot(C),0.85))
Adjust   (Ap,Bp,Cp) [z Mr[2] b 0.64]
loop i=0.9999, 0.96,-0.00025 [h .1]
  Adjust (Ap,Bp,Cp) [s i z (i*Mr[2]) b i a -.9]

} //=============================================== // Adjust Koch_Triangle to points: A, B, C //=============================================== // Adjust triangle to (0,0), (1,0), (0,1) AdjTri=[x( 1/3)(1/3) s 1 (2/sqrt(3)) skew -30 0]

shape Adjust (vector2 A, vector2 B, vector2 C) { D=C+B-A,C+B-A

Koch_Triangle [[trans A B D trans AdjTri]]

} //=============================================== // Triangle: Cut out “Von Koch” (variant) // ( recursion isn’t possible for subpaths ) //=============================================== // Divide line Vs,Ve into 4 Koch segments vector10 NL(Q,vector2 Vs, vector2 Ve)

let( Xs=Vs; Xe=Ve; Ys=Vs; Ye=Ve

;X1=(2*Xs+Xe)/3 ; Y1=(2*Ys+Ye)/3 ;X2=(Xs+Xe)/2+(Ys-Ye)*Q ; Y2=(Ys+Ye)/2+(Xe-Xs)*Q ;X3=(Xs+2*Xe)/3 ; Y3=(Ys+2*Ye)/3 ;(Xs,Ys),(X1,Y1),(X2,Y2),(X3,Y3),(Xe,Ye) )

path Sp4(Q,vector2 Vs, vector2 Ve) { VN=NL(Q,Vs,Ve)

loop i=0,8,2 [] LINETO (VN[i,2])

} path Sp3(Q,vector2 Vs, vector2 Ve) { VN=NL(Q,Vs,Ve)

loop i=0,8,2 [] path Sp4(Q,VN[i,2],VN[i+2,2])[]

} path Sp2(Q,vector2 Vs, vector2 Ve) { VN=NL(Q,Vs,Ve)

loop i=0,8,2 [] path Sp3(Q,VN[i,2],VN[i+2,2])[]

} path Sp1(Q,vector2 Vs, vector2 Ve) { VN=NL(Q,Vs,Ve)

loop i=0,8,2 [] path Sp2(Q,VN[i,2],VN[i+2,2])[]

}

path Koch_Triangle { W = sqrt(1/3) MOVETO(0,W)

loop 3 [r -120] LINETO(W*sin(120),W*cos(120)) 
loop A=0,6 []
{ Vs=cos(60*(A+1)),sin(60*(A+1))
  Ve=cos(60*(A+2)),sin(60*(A+2))
  Q =if(mod(A,2),1,-1)*W/2
  path Sp1(Q,Vs,Ve)[s (W/2)]
} CLOSEPOLY() FILL [sat 1]

}

//=============================================== // Rotate, Project, Length, Centroid, Dilate //———————————————– Alfa= 203 CosA=cos(Alfa) SinA=sin(Alfa) Beta= -58 CosB=cos(Beta) SinB=sin(Beta)

vector3 Rot(vector3 V)

CosA*V -SinA*V

,CosB*SinA*V+CosB*CosA*V-SinB*V ,SinB*SinA*V+SinB*CosA*V+CosB*V

vector2 Prj(vector3 V)

V/(2-V/15)

,V/(2-V/15)

Len(vector3 A, vector3 B)

sqrt((B-A)^2+(B-A)^2+(B-A)^2)

vector3 Centroid(vector3 A, vector3 B, vector3 C)

(A+B+C)/3

,(A+B+C)/3 ,(A+B+C)/3

vector3 Dil(vector3 A, vector3 B, Fct)

(1-Fct)*A+Fct*B

,(1-Fct)*A+Fct*B ,(1-Fct)*A+Fct*B

# runcfdg icosahedron.cfdg