Functions to generate Povray files for the open Raytracer.

The Povray interface of Euler generates Povray files in the home directory of the user, and calls Povray to parse these files. The default file name is current.pov, and the default directory is eulerhome(), usually c:\Users\Username\Euler. Povray generates a PNG file, which can be loaded by Euler into a notebook. To clean up these files, use povclear().

You need to load the Povray commands with "load povray". There is an introduction notebook demonstrating the package.

For more information on the Povray povray project, see

Moreover, you need to install Povray (32bit or 64bit), and put the sub-directory "bin" of Povray into the environment path, or set the variable "defaultpovray" with full path pointing to "pvengine.exe".

The pov3d function is in the same spirit as plot3d. It can generate the graph of a function f(x,y), or a surface with coordinates X,Y,Z in matrices, including optional level lines. This function starts the raytracer automatically, and loads the scene into the Euler notebook.

Besides pov3d(), there are many functions, which generate Povray objects. These functions return strings, containing the Povray code for the objects. To use these functions, start the Povray file with povstart(). Then use writeln(...) to write the objects to the scene file. Finally, end the file with povend(). By default, the raytracer will start, and the PNG will be inserted into the Euler notebook.

The object functions have a parameter called "look", which needs a string with Povray code for the texture and the finish of the object. The function povlook() can be used to produce this string. It has parameters for the color, the transparency, Phong Shading etc.

Note that the Povray universe has another coordinate system. This interface translates all coordinates to the Povray system. So you can keep thinking in the Euler coordinate system with z pointing vertically upwards,a nd x,y,z axes in right hand sense.

For vectors you can always use a instead of [a,a,a], and the vector "povx" is defined as [1,0,0] etc.

functionpovrgb(c:integer, transparent=0)

Color in rgb for Povray This function returns a string containing a color definition for Povray using "color rgb <r,g,b>". If transparent>0, "rgbf" will be used instead of "rgb". The function works for the 16 Euler colors or colors generated with rgb(r,g,b). See:

povlook (Povray with Euler)

functionpovxyz()

povxyz(x,y,z), povxyz(v), povxyz(r) compute coordinates for Povray. This function is used by many of the Povray functions to translate coordinates to a string for Povray. Note that Povray coordinates are different from Euler coordinates. The horizontal plane is x-z in Povray, and x-y in Euler. This function takes care of that transformation. With one real argument a the vector [a,a,a] is used. Also the functions povx, povy, povz can be used for the coordinate axes, and povc for the coordinate center. The functions returns a string. See:

povy (Povray with Euler),

povz (Povray with Euler),

povc (Povray with Euler)

functionpovx() := [1,0,0]; // x-axis

functionpovy() := [0,0,1]; // y-axis

functionpovz() := [0,1,0]; // z-axis

functionpovc() := [0,0,0]; // center

functionwriteCamera(aspect:positive number=1, anaglyph=0)

Set the camera for Povray. This function need not be used directly. Use povstart() instead. The function writes the camera position to the output file for Povray. The current view is used to position the camera. To change the view use the view() function, or the zoom(), viewangle(), or viewheight(), viewdistance() service functions. The camera looks at the current center. To change this use the center() function. aspect : The image is assumed to be square. If not, change the aspect. anaglyph : If this is true the scene will be tilted with the default anaglyph separation times the anaglyph value. This is used in pov3d() and povanaglyph(). See:

povstart (Povray with Euler),

pov3d (Povray with Euler),

povanaglyph (Povray with Euler)

functionwriteAxis(t1:number, t2:number, delta:real vector=none, d:number=0.02, c:integer=gray, axis:integer=1, add:number=0.1)

Axis for Povray Creates an axis in form of an arrow. This functions is used in pov3d to create all three axes. Since pov3d packs the scene into the unit cube, and scales the function, there is a translation vector delta. t1, t2 : left and right end of the axis delta : translate the axis using this vector (in Euler coordinates) d : thickness of the axis c : color of the axis axis : which axis 1=x, 2=y, 4=z add : additional length exceeding t1 an t2 on both sides See:

pov3d (Povray with Euler)

functionwriteAxes(xmin=-1,xmax=1,ymin=-1,ymax=1,zmin=-1,zmax=1, delta:real vector=none, d:number=0.02, c:integer=gray, add:number=0.1)

Write an axis System. The function expects the start and the end of each axis. For the other parameters see writeAxis(). It writes to the Povray file directly. Example: >povstart(zoom=4,center=[0,0,1/2],height=45?); >writeAxes(-1,1,-1,1,0,1.4,d=0.01); >writeln(povsphere([0,0,1/2],1/2,povlook(green,0.5))); >writeln(povpoint([0,0,1],povlook(gray),size=0.02)); >povend(); See:

writeAxis (Povray with Euler)

functionwriteGlobal(c:integer=white, gamma=1.4)

Write the global header. This is called automatically with povstart(). Sets the color of the ambient light and the assumed gamma.

functionwriteBackground(c:integer=white)

Write the background for the scene. This is called automatically with povstart(). Sets the background color.

functionwriteLight(v:real vector=[2,3,4], c:integer=white, distance=none, shadow=true, fade=0)

Write the light source. This is called automatically with povstart(). The light source is in direction of the vector v. The distance of the light source is the distance in view (which is the distance of the camera). shadow=0 : produces no shadow in the scene.

functionpovray(filename=none, width:index=450, height:index=450, aspect:positive number=1, exit:integer=true)

Start the Povray process. By default, this is called in povend(). Start the Povray program. The program name is in the global variable "defaultpovray". The default filename current.pov in the user home directory is used if file==none. exit=false allows to keep the Povray window open. Euler will wait, until you close it. filename : The filename to be used (without .pov)

functionpovopen(filename)

Open the povray file for writing. This is called in povstart(). Do not forget to close it before you use the file. The povend() function closes the file automatically. See:

open (Euler Core)

functionpovscalexyz(x,y,z)

Scale x,y,z to fit into a unit cube. Return {x,y,z,f,cx,cy,cz} where f is the factor used, and cx,cy,cz is the new center of the coordinate system. See:

pov3d (Povray with Euler)

functionpovscalef(x,y)

Scale x,y to fit into a unit square. See:

povscalexyz (Povray with Euler)

functionpovscalez(z)

Scale z to fit into [-1,1]

functionpovload(file=none, anaglyph=false)

Load the Povray image into the Notebook. By default, this is called in povend(). file : If none, use defaultfile

functionpovstart(file=none, zoom=none, distance=none, angle=none, height=none, light:real vector=[2,2,4], lightcolor=white, background=white, aspect=1, shadow=true, center=[0,0,0], fade=0, anaglyph=0)

Start a Povray scene. This function opens the file, and sets the scene, including light, camera and background. zoom, distance, angle, height : Change the view locally in this function. The angle is measured from the negative y-axis, as in plot3d() and view(). The height is from the x-y-plane. Both angles are in radians. Use angle=30? to convert. light, lightcolor : A vector to the light source and the color of the light. background : The background color aspect : The aspect ratio of your window. For square images use 1. Note that you need the same aspect in povend(). shadow : A flag for shadows. center : The point, where the camera looks at. The camera itself is determined by the view. fade : If nonzero, fading with this exponential rate is used. The fading distance is the distance from the light to the center. See:

povend (Povray with Euler),

view (Euler Core),

view (Plot Functions),

view (Maxima Documentation)

functionpovend(file=none, povray=true, w=450, h=450, aspect=1, exit=true, imgload=true)

End a Povray scene Closes the scene file. By default, the Povray process will start, and the image will be loaded into the notebook. w,h,aspect : In combination determine the aspect ratio of your scene. Note that you need the same aspect as in povstart(). exit : If false, the Povray window will not close automatically. imgload : If false, the image will not be loaded. You can then find the image in the Euler subdirectory of your home directory. >povstart(zoom=3.6,aspect=4/3); >writeln(povsphere([0,-1,0],1/2,povlook(gray))); >writeln(povsphere([0,1,0],1/2,povlook(gray))); >writeln(povsphere([0,0,0],1,povlook(green))); >povend(h=300,aspect=4/3); Or, if you want to insert the image later: >povend(h=400,aspect=4/3,<imgload); // make image >loadimg(defaultfile); // manually insert the image See:

povstart (Povray with Euler)

functionpovanaglyph(scene$:string, file=none, zoom=none, distance=none, angle=none, height=none, light:real vector=[2,2,4], lightcolor=white, background=white, aspect=1, shadow=true, center=[0,0,0], fade=0, w=450, h=450, aspect=1, exit=true, imgload=true)

Create a red/cyan anaglyph Create an anaglyph with a scene, which is generated in the function scene. The Povray command runs twice, and generates two PNG files in the user directory. The parameters combine povstart and povend >function f() ... $ writeAxes(-1,1,-1,1,-1,1); $ writeln(povcylinder([-1,0,0],[1,0,0],1,povlook(lightblue,0.4))); $endfunction >povanaglyph("f"); See:

povstart (Povray with Euler),

povend (Povray with Euler)

functionpovlook(color=green, transparent=0, ambient=none, phong:real=none, phongsize:real=100, reflection=none, diffuse=none)

Texture and finish of an object. Returns a string containing the Povray code for this texture and finish. color : the color of the object. transparent : If nonzero, the color will be transparent. ambient : The amount of ambient light to be used. phong, phongsize : If nonzero, a shining finish will be used. reflection : Makes the object reflect other objects. >povlook(green) >povlook(gray,0.5) // half transparent See:

rgb (Plot Functions)

functionpovl() := povlook(args(1));

functionwriteTriangleMesh(x:real, y:real, z:real, look:string=defaultlook, xv:real=none, yv:real=none, zv:real=none, simple:integer=false)

Mesh object with triangles Write a mesh object for the surface with coordinates x,y,z. The surface is formed of 4 triangles for each rectangular segment, connecting the corner to the average midpoint of the 4 points. The evaluation of x,y,z follows the matrix language of Euler. If normal vectors are present, the functions used two triangles in each matrix element, but adds the vectors to the scene. Note that this function does writeln() to the output file. If you need an object use povtriangles(). See:

povtriangles (Povray with Euler)

functionpovtriangles(x:real, y:real, z:real, look:string=defaultlook, xv:real=none, yv:real=none, zv:real=none, simple:integer=false, include=false)

A mesh object Mesh objects are formed of hundreds of triangles. They cannot be stored in Euler strings. So this function write either to an include file and returns a #include statement. Or it writes to the scene file, and #declares an object there. Then it returns an object. Usually, it is not necessary to use an include file. For a description of the triangle mesh and the normal vectors, see writeTriangleMesh(). See:

writeTriangleMesh (Povray with Euler)

functionpovgrid(x:real, y:real, z:real, look:string=defaultlook, d=none, dballs=none, include=false, skip:positive integer vector=none)

A mesh object Grid objects, like mesh objects, are formed of hundreds of triangles. They cannot be stored in Euler strings. So this function write either to an include file and returns a #include statement. Or it writes to the scene file, and #declares an object there. Then it returns an object. Usually, it is not necessary to use an include file. d, dballs : Diameter of grid and balls skip : Scalar or 1x2 vector. Skip rows and columns of the matrix. With this parameter, it is possible to generate a fine grid, but show only a few grid lines. Example: >povstart(center=[0,0,1],zoom=3.5); >x=-1:0.05:1; y=x'; >writeln(povgrid(x,y,x^2+y^2,skip=5,d=0.01,dballs=0.02)); >povend(); See:

povtriangles (Povray with Euler)

functionpovbox(P1: real vector, P2: real vector, look:string=defaultlook)

A box with these two corners. The box parallel to the axes. If you need rotated box, use an object containing the box, and the rotation parameter. >povstart(); >writeln(povobject(povbox([-1,-1,-1],[1,1,1]),rotate=xrotate(-20?))); >povend();

functionpovcylinder(P1: real vector, P2: real vector, r: number, look:string=defaultlook, open:integer=false)

A cylinder with these two ends and radius

functionpovdisc(P: real vector, v: real vector, r:number, d: number=none, look:string=defaultlook)

A disc with center, normal and radius If d==none the disc uses defaultpointsize for its thickness.

functionpovintersection(v:string vector, look:string=defaultlook)

Intersection of the objects in v v : a vector of string, containing the objects.

functionpovunion(v:string vector, look:string=defaultlook)

Union of the objects in v v : a vector of strings, containing the objects.

functionpovmerge(v:string vector, look:string=defaultlook)

Merge of the objects in v Merging removes the inner boundaries v : a vector of strings, containing the objects. See:

povunion (Povray with Euler),

povintersection (Povray with Euler)

functionpovdifference(v1:string, v2: string, look:string=defaultlook)

v1 minus v2

functionpovcone(P1: real vector, r1: number, P2: real vector, r2: number, look:string=defaultlook)

A cone with these two ends and radii.

functionpovsphere(P: real vector, r: number, look:string=defaultlook)

A sphere with midpoint and radius.

functionpovtext(s:string, P:real vector, look:string=defaultlook, d:number=none, size:number=none, font="timrom.ttf", rotate:number=0°)

Text object at position P d : thickness of the text size : height of the text font : text font name rotate : rotation around vertical axis

functionpovplane(P: real vector, d: number, look:string=defaultlook, clippedby:string=none)

A plane with a'.v=d, a=[x,y,z]. Note that the plane is really a half space, unless it is clipped. For clipping use any full object.

functionpovpoint(P: real vector, look:string=defaultlook, size:number=none)

A point The size will be the radius of the sphere. By default it is the defaultpointsize. >povstart(zoom=2,center=[0,0,-1]); >X=randnormal(3,100,0,1/2); >loop 1 to cols(X); writeln(povpoint([X[1,#],X[2,#],X[3,#]],povlook(red))); end; >writeln(povdisc([0,0,-3],[0,0,1],2)); >writeAxis(-3,1,axis=3); >povend();

functionpovsegment(P1: real vector, P2: real vector, look:string=defaultlook, size=none)

A line segment between the two points

functionpovarrow(x: real vector, v: real vector, look:string=defaultlook, d:number=none)

An arrow d : The thickness of the arrow. By default, this is the defaultpointsize

functionpovdefine(a:string, b: string)

Declares an object in Povray Sometimes, you wish to define an object in Povray, not in an Euler string. You can later use the object by name. You can also define other things, like finishes in Povray.

functionxrotate(a) := " rotate "+deg(a)+" *x "

functionyrotate(a) := " rotate "+deg(a)+" *z "

functionzrotate(a) := " rotate "+deg(a)+" *y "

functionpovobject(object:string, look:string="", translate=none, rotate=none, scale=none)

Povray object containing another object scale : A vector or a scalar to stretch the object. If a vector is used its coordinates are the factors in each of the three directions. rotate : The rotation parameter. This can be a vector, which contains the rotations around the x, y, and z axis in this order. The values must be in radians. Usually, you want to use the functions xrotate(a), yrotate(a), zrotate(a), which return strings. These strings can be concatenated for the rotation parameter. translate : A vector for the translation. Example: >povstart(); >writeAxes(-1,1,-1,1,-1,1); >sph=povsphere([0,0,0],1); >rot=xrotate(10?)+yrotate(45?); >tr=[0,0,-1/2]; >writeln(povobject(sph,scale=[2,1,0.2],rotate=rot,translate=tr)); >povend();

functionpovsurface(f:string, look:string=defaultlook, container:string=none, maxgradient=5, open=true)

Implicit surface The surface is defined by f(x,y,z)=0. f : Contains the formula f. Povray uses a different syntax for mathematical functions. E.g., pow(x,2) must be used instead of x^2. Please refer to a Povray manual. The file functions.inc is #included in povstart(). maxgradient : If 5 is too low and the surface looks ugly, use a higher value at the cost of increased time. open : If false, the cube will be filled between the surface and the cube. Effectively, the set where the function <=0 will be visible. container : A box containing the surface. Default is povbox(-1,1,""). Example: >povstart(); >writeln(povsurface("pow(x,4)+pow(y,6)+pow(z,2)-1")); >writeAxes(); >povend();

functionpovclear()

Remove all temporary Povray files.

functionpov3d(x, y=none, z=none, xmin:number=-1, xmax:number=1, ymin:number=-1, ymax:number=1, r:number=none, n:index=40, file=none, axis:integer=7, look:string=none, axiscolor:integer=gray, zoom=none, distance=none, angle=none, height=none, light:real vector=[2,3,4], lightcolor=white, background=white, povray=true, w=450, h=450, shadow=true, center=[0,0,0], fade=0, xv:real=none, yv:real=none, zv:real=none, level:real vector=none, dlevel=0.02, levellook:string=none, add=none, loadimg=true, anaglyph=false, fscale=true, scale=true)

Multi-purpose function to plot 3D in Povray pov3d("f(x,y)") : plots a function pov3d(x,y,z) : plots a surface given by x,y,z xmin,xmax,ymin,ymax : range x and y n : resolution for x and y r : alternatively radius for quadratic or polar plots cx, cy, cz : center for r file : used, if not the defaultfile="current" (without .pov) color : color of the plot axis : 1,2,4 or sum of these for x, y, z axis axiscolor : color of axis zoom, distance, angle, height : see view() light : direction vector to the light source lightcolor : color of the light background : color of the background povray : if true, the Povray program is called w, h : size of png loadimg : if false, the image is not loaded into the notebook. add : one Povray object to add >pov3d("x^3+y^2",angle=-80?, ... > level=-2:0.2:2,dlevel=0.01,levellook=povlook(red), ... > add=povtext("z=x^3+y^2",[0,-0.2,1.2],size=0.06,rotate=-90°), ... > zoom=4); See:

view (Euler Core),

view (Plot Functions),

view (Maxima Documentation)