// BOLTNUT / Nuts Sept. '07 // by Tsutomu HIGO URL:http://www.asahi-net.or.jp/~nj2t-hg/ #version 3.6; global_settings { max_trace_level 4 assumed_gamma 2.2 } light_source {<40, 20, -10> color <1,1,1>} camera { location <-1, 6, 12> angle 100 look_at <1, -15, 0> } //BOLTNUT SIZE DATA #declare Sznut = array[2][6][8] { { { 5, 4.134, 5.4, 0.8, 8.79, 4.6, 3.5, 7.9}, { 6, 4.917, 6.4, 1.0,11.05, 5.1, 4.0, 9.9}, { 8, 6.647, 8.4,1.25,14.38, 6.6, 5.3,12.9}, {10, 8.376,10.4, 1.5,17.77, 8.2, 6.4,15.9}, {12,10.106,12.5,1.75,20.03,10.6, 7.5,17.9}, {16,13.835,16.7, 2.0,26.75,14.5,10.0,23.8} }, { { 5, 4.134, 5.4, 0.8, 8.79, 5.0, 3.5, 7.9}, { 6, 4.917, 6.4, 1.0,11.05, 5.6, 4.0, 9.9}, { 8, 6.647, 8.4,1.25,14.38, 7.3, 5.3,12.9}, {10, 8.376,10.4, 1.5,17.77, 9.1, 6.4,15.9}, {12,10.106,12.5,1.75,20.03,11.8, 7.5,17.9}, {16,13.835,16.7, 2.0,26.75,16.1,10.0,23.8} } } //Sznutstle : Sznut [A][*][*] A = 0-standard, 1-thick //Sznutsize : Sznut [*][B][*] B = 0-M5, 1-M6, 2-M8, 3-M10, 4-M12, 5-M16 //NUT #macro Nut (Sznutstle, Sznutsize, Nr0, C) #declare NatD = Sznut[Sznutstle][Sznutsize][4]; #declare NatW = Sznut[Sznutstle][Sznutsize][7]; #declare NatH = Sznut[Sznutstle][Sznutsize][5]; #declare NatId = Sznut[Sznutstle][Sznutsize][2]; #declare BoltH = Sznut[Sznutstle][Sznutsize][6]; #declare BoltD = 0.98*Sznut[Sznutstle][Sznutsize][0]; #declare Pich = Sznut[Sznutstle][Sznutsize][3]; intersection { cylinder {-1*y, 1.2*NatH*y, BoltD/2/0.98-Pich*1.732/1.828/8*4.5 inverse} #if (C = 1) box {<0, -1, -2*NatD/2> <2*NatW/2, 2*NatH, 0> rotate y*30 inverse} #end box {<-NatW/2, 0, -NatD/2> } box {<-NatW/2, -0.1, -NatD/2> rotate y* 60} box {<-NatW/2, -0.1, -NatD/2> rotate y*120} cone {1.00001*NatH*y, 0.99999*NatW/2, -0.00001*y, 0.99999*NatW/2+1.75*NatH} cone {1.00001*NatH*y, 0.99999*NatW/2+1.75*NatH, -0.00001*y, 0.99999*NatW/2} cone {1.00001*NatH*y, 0.99999*NatId/2, (1.00001*NatH-NatH/1.5)*y, 0 inverse} cone {-0.00001*y, 0.99999*NatId/2, (NatH/1.5)*y, 0 inverse} intersection { cylinder {-1*y, 1.2*NatH*y, BoltD/2/0.98} object { union { #declare N = int(1.2*NatH/Pich)+1; #while (N > -1) #declare Nr = Nr0; #while (Nr > 0) box { <-Pich/2, -Pich/2, -Pich/2> < Pich/2, Pich/2, Pich/2> rotate z*45 rotate x*-atan(Pich/(3.14*BoltD))*180/3.14*1.5 scale <1.732/1.828, 1/1.414, 1> translate x*(BoltD/2+Pich*1.732/1.828/8) translate y*(Pich*N-Pich/Nr0*Nr) rotate y*Nr/Nr0*360 } #declare Nr = Nr-1; #end #declare N = N-1; #end } inverse } inverse } } #end //BEADS #declare Imax = 5000; #declare Cp = array[Imax][2] #declare I = 0; #while (I < Imax) #declare J = 0; #while (J < 2) #declare Cp[I][J] = 0; #declare J = J+1; #end #declare I = I+1; #end #macro Acosc (Rc, Dy, Ac) #declare Ac = acos(Rc); #if (Dy < 0) #declare Ac = 2*pi-Ac; #end #if (Ac = 0) #declare Ac = 2*pi; #end #end #declare I = 0; #while (I < 6) #declare Pe = 1+I; #declare Cp[Pe][0] = Cp[0][0]+2*cos(pi/3*I); #declare Cp[Pe][1] = Cp[0][1]+2*sin(pi/3*I); #declare I = I+1; #end #declare Ap = 0; #declare As = 0; #declare Al = 0; #declare Ae = 0; #declare Ad = 0; #declare Rndm = seed(89); #macro Spculc (N, P, Pe) #declare Rs = sqrt(pow(Cp[P][0]-Cp[N][0],2)+pow(Cp[P][1]-Cp[N][1],2))/4; Acosc ((Cp[P][0]-Cp[N][0])/4/Rs, Cp[P][1]-Cp[N][1], Ap) #declare Re = sqrt(pow(Cp[N+1][0]-Cp[N][0],2)+pow(Cp[N+1][1]-Cp[N][1],2))/4; Acosc ((Cp[N+1][0]-Cp[N][0])/4/Re, Cp[N+1][1]-Cp[N][1], Ae) Acosc (Rs, 1, As) Acosc (Re, 1, Al) #if (rand(Rndm) > 0.1) #declare Ad = rand(Rndm); #end #if (Ae-Ap < 0) #declare Ap = Ap-2*pi; #end #if (Ae-Ap-As-Al-Ad > 0) #declare I = 0; #while (I < int((Ae-Ap-As-Al-Ad)*3/pi)+1) #declare Pe = P+1+I; #declare Cp[Pe][0] = Cp[N][0]+2*cos(Ap+As+Ad+pi/3*I); #declare Cp[Pe][1] = Cp[N][1]+2*sin(Ap+As+Ad+pi/3*I); #declare I = I+1; #end #declare Ad = 0; #else #if (Ae-Ap-As-Al > 0) #declare I = 0; #while (I < int((Ae-Ap-As-Al)*3/pi)+1) #declare Pe = P+1+I; #declare Cp[Pe][0] = Cp[N][0]+2*cos(Ap+As+pi/3*I); #declare Cp[Pe][1] = Cp[N][1]+2*sin(Ap+As+pi/3*I); #declare I = I+1; #end #end #end #end #declare Ps = 6; #declare Jd = 1; #while (Jd < 4000) Spculc (Jd, Ps, Pe) #declare Ps = Pe; #declare Jd = Jd+1; #end // //MAIN #declare Scale = 2/Sznut[0][4][4]; #declare I = 0; #while (I < 150) object { Nut(0,4,24,0) scale Scale rotate y*21*I translate pigment {color rgb <1, 0.8, 0.5>} finish {reflection 0.5 ambient 0.4 phong 0.3 brilliance 0.5 diffuse 2} } #declare I =I+1; #end background {color rgbt <0, 0.03, 0>}