# =========================================================================== # # 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)¶ ↑
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¶ ↑
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