POV-Ray : Newsgroups : povray.binaries.images : joining the greeble-madness :) : Re: Feedback Server Time
7 Aug 2024 13:21:56 EDT (-0400)
  Re: Feedback  
From: Sven Littkowski
Date: 7 Feb 2016 13:08:24
Message: <56b78818$1@news.povray.org>
I found that file in another posting of Zeger, dating back to 2002!   :-D

Here it is, for all those who need it for Zeger's formidable greebles.

------------------------

//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=<min(Begin.x,Eind.x),min(Begin.y,Eind.y),min(Begin.z,Eind.z)>+R;
	#local E=<max(Begin.x,Eind.x),max(Begin.y,Eind.y),max(Begin.z,Eind.z)>-R;
	merge {	//merge, zodat het ook voor transparante materialen werkt.
		#if (R > 0)
			//Onderste rij
			sphere {
				B,R
			}
			sphere {
				<E.x,B.y,B.z>,R
			}
			sphere {
				<E.x,B.y,E.z>,R
			}
			sphere {
				<B.x,B.y,E.z>,R
			}
			//Bovenste rij			
			sphere {
				E,R
			}
			sphere {
				<E.x,E.y,B.z>,R
			}
			sphere {
				<B.x,E.y,E.z>,R
			}
			sphere {
				<B.x,E.y,B.z>,R
			}
			//Onderste cilinders
			cylinder {
				B,<E.x,B.y,B.z>,R
			}
			cylinder {
				B,<B.x,B.y,E.z>,R
			}
			cylinder {
				<E.x,B.y,B.z>,<E.x,B.y,E.z>,R
			}
			cylinder {
				<E.x,B.y,E.z>,<B.x,B.y,E.z>,R
			}
			//Bovenste cilinders
			cylinder {
				<B.x,E.y,B.z>,<E.x,E.y,B.z>,R
			}
			cylinder {
				<B.x,E.y,B.z>,<B.x,E.y,E.z>,R
			}
			cylinder {
				<E.x,E.y,B.z>,<E.x,E.y,E.z>,R
			}
			cylinder {
				<E.x,E.y,E.z>,<B.x,E.y,E.z>,R
			}
         //Verticale cilinders
         cylinder {
         	B,<B.x,E.y,B.z>,R
         }
         cylinder {
         	<E.x,B.y,B.z>,<E.x,E.y,B.z>,R
         }
         cylinder {
         	<B.x,B.y,E.z>,<B.x,E.y,E.z>,R
         }
         cylinder {
         	<E.x,B.y,E.z>,<E.x,E.y,E.z>,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=<min(Begin.x,Eind.x),min(Begin.y,Eind.y),min(Begin.z,Eind.z)>+R;
	#local E=<max(Begin.x,Eind.x),max(Begin.y,Eind.y),max(Begin.z,Eind.z)>-R;
	merge {
		object {Kader (Begin,Eind,Straal)}
		box {
			B,E
		}
		box {
			<B.x,B.y,B.z-R>,<E.x,E.y,E.z+R>
		}
		box {
			<B.x-R,B.y,B.z>,<E.x+R,E.y,E.z>
		}
		box {
			<B.x,B.y-R,B.z>,<E.x,E.y+R,E.z>
		}
	}
#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<ResX)

			#declare Tely=0;
			#while (Tely<ResY)

				#local PlaatsX=(Min.x+(Max.x-Min.x)*(Telx/ResX));
				#local PlaatsY=(Min.y+(Max.y-Min.y)*(Tely/ResY));
				#local Norm=<0,0,0>;
				#local Loc=trace(Tekst,<PlaatsX,PlaatsY,-10>,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);
	<bezierx,beziery,bezierz>
#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));
	<A2,0,A>
#end


Post a reply to this message

Copyright 2003-2023 Persistence of Vision Raytracer Pty. Ltd.