//Een afgeronde kader, zoals box{}, maar dan afgerond, en enkel de randen. #macro Kader (Begin,Eind,Straal) #local Begin=Begin*<1,1,1>; #local Eind=Eind*<1,1,1>; #local R=Straal; #local B=+R; #local E=-R; merge { //merge, zodat het ook voor transparante materialen werkt. #if (R > 0) //Onderste rij sphere { B,R } sphere { ,R } sphere { ,R } sphere { ,R } //Bovenste rij sphere { E,R } sphere { ,R } sphere { ,R } sphere { ,R } //Onderste cilinders cylinder { B,,R } cylinder { B,,R } cylinder { ,,R } cylinder { ,,R } //Bovenste cilinders cylinder { ,,R } cylinder { ,,R } cylinder { ,,R } cylinder { ,,R } //Verticale cilinders cylinder { B,,R } cylinder { ,,R } cylinder { ,,R } cylinder { ,,R } #end } #end //Zoals box{}, maar dan afgerond. Gebruikt Kader()! #macro Ronddoos(Begin,Eind,Straal) #local Begin=Begin*<1,1,1>; #local Eind=Eind*<1,1,1>; #local R=Straal; #local B=+R; #local E=-R; merge { object {Kader (Begin,Eind,Straal)} box { B,E } box { , } box { , } box { , } } #end //Beveled tekst. Geeft als resultaat een afgeronde tekst met instelbare resolutie (bestaat uit blobs) #macro Text (Lettertype, Tkst, R, P, T) #local Tekst= text { ttf Lettertype //"starwars.ttf" Tkst,.01,0 } #declare Min=min_extent(Tekst); #declare Max=max_extent(Tekst); #local Telx=0; #local Tely=0; blob { threshold T #while (Telx; #local Loc=trace(Tekst,,z,Norm); #if ((Norm.x*Norm.y*Norm.z)!=0) sphere { Loc,R,P } #end #local Tely=Tely+1; #end #local Telx=Telx+1; #end } #end //Een alternatieve versie voor Atan2. Werkt ook met beiden nul. #macro Atan (arg1,arg2) #if (arg1=0 & arg2=0) 0 #else atan2(arg1,arg2) #end #end //Geeft het punt op plaats T van de bezier-kromme met controlepunten P1, P2, P3 en P4 #macro Bezier (P1,P2,P3,P4,T) #local beziera=pow(1-T,3); #local bezierb=3*pow(1-T,2)*T; #local bezierc=3*(1-T)*pow(T,2); #local bezierd=pow(T,3); #local beziere=pow(T,2); #local bezierf=pow(1-T,2); #local bezierg=2*(1-T)*T; #local bezierh=bezierf-bezierg; #local bezieri=bezierg-beziere; #local bezierx=(beziera*P1.x + bezierb*P2.x + bezierc*P3.x + bezierd*P4.x); #local beziery=(beziera*P1.y + bezierb*P2.y + bezierc*P3.y + bezierd*P4.y); #local bezierz=(beziera*P1.z + bezierb*P2.z + bezierc*P3.z + bezierd*P4.z); #end //De rotatie rond X en Z berekenen voor een bepaald punt op een bezierkromme met controlepunten P1, P2, P3 en P4 op plaats T //Ik haal deze formules van een INC-file van Michael D Johnson. Er stond bij dat hij niet zeker is van deze formules. //Ik dus ook niet... :-) #macro BezierRot(P1,P2,P3,P4,T) #local beziera=pow(1-T,3); #local bezierb=3*pow(1-T,2)*T; #local bezierc=3*(1-T)*pow(T,2); #local bezierd=pow(T,3); #local beziere=pow(T,2) #local bezierf=pow(1-T,2); #local bezierg=2*(1-T)*T; #local bezierh=bezierf-bezierg; #local bezieri=bezierg-beziere; #local bezierx=(beziera*P1.x + bezierb*P2.x + bezierc*P3.x + bezierd*P4.x); #local beziery=(beziera*P1.y + bezierb*P2.y + bezierc*P3.y + bezierd*P4.y); #local bezierz=(beziera*P1.z + bezierb*P2.z + bezierc*P3.z + bezierd*P4.z); #local bezierdx=(-bezierf*P1.x + bezierh*P2.x + bezieri*P3.x + beziere*P4.x); #local bezierdy=(-bezierf*P1.y + bezierh*P2.y + bezieri*P3.y + beziere*P4.y); #local bezierdz=(-bezierf*P1.z + bezierh*P2.z + bezieri*P3.z + beziere*P4.z); #local A2=degrees(Atan(bezierdy,bezierdz)); #local A=degrees (Atan(bezierdy,bezierdx)); #end