\usepackage{amsmath,amssymb,graphicx,alltt} \DeclareGraphicsRule{*}{mps}{*}{} \graphicspath{{../mps/}} \newfont{\normald}{logod10 scaled 1024} \newcommand{\MF}{{\normald METAFONT}} \newcommand{\MP}{{\normald METAPOST}} \newcommand{\FP}{{\normald FEATPOST}} \newcommand{\changeableframetitle}[1]{\mode{\frametitle{#1}}} \newcommand{\myem}[1]{\texttt{#1}} \title{\FP\ manual} \author{\href{mailto:lnobreg@gmail.com}{L. Nobre G.}} \date{0.8.8} \begin{document} \mode
{\maketitle} \frame{\titlepage} \frame{ \changeableframetitle{Abstract} \FP\ is an extension of the \MP\ language that has a fairly large set of \alert{feat}ures to facilitate the production of schematic diagrams, both in three dimensions (3D) and in two dimensions (2D). These schematic diagrams are vectorial and focus on the representation of edges (unlike ray-traced raster images that focus on surfaces). } \mode
{\tableofcontents} \section{Getting started} \frame{ \changeableframetitle{Getting started} \myem{input featpost3Dplus2D;} } \section{First taste of \FP} \frame{ \changeableframetitle{First taste of \FP} Each perspective depends on the point of view. \FP\ uses the global variable \myem{f}, of \myem{color} type, to store the $(X,Y,Z)$ space coordinates of the point of view. Also important is the aim of view (global variable \myem{viewcentr}). This pair of points defines the line of view. } \frame{ The perspective consists of a projection from space coordinates into planar $(u,v)$ coordinates on the projection plane. \FP\ uses a projection plane that is perpendicular to the line of view and contains the \myem{viewcentr}. Furthermore, one of the projection plane axes is horizontal and the other is perpendicular and on the projection plane. ``Horizontal'' means parallel to the $XY$ plane. } \frame{ One consequence of this setup is that \myem{f} and \myem{viewcentr} must not be on the same vertical line. The three kinds of projection known to \FP\ are schematized in figures \ref{coniproj}, \ref{paraproj} and \ref{spheproj}. The macro that actually does the projection is, in all cases, \myem{rp}. } \frame{ \begin{figure}[hbtp] \begin{center} \begin{tabular}{cc} \includegraphics[width=65mm]{thethreekindsofperspec.2} & \includegraphics[width=0.25\columnwidth]{cubicfigures.2} \end{tabular} \end{center} \caption{Central projection (default).} \label{coniproj} \end{figure} } \frame{ \begin{figure}[hbtp] \begin{center} \begin{tabular}{cc} \includegraphics[width=65mm]{thethreekindsofperspec.1} & \includegraphics[width=0.25\columnwidth]{cubicfigures.1} \end{tabular} \end{center} \caption{Parallel projection.} \label{paraproj} \end{figure} } \frame{ \begin{figure}[hbtp] \begin{center} \begin{tabular}{cc} \includegraphics[width=65mm]{thethreekindsofperspec.3} & \includegraphics[width=0.25\columnwidth]{cubicfigures.3} \end{tabular} \end{center} \caption{Spherical projection. The spherical projection is the composition of two operations: (i)~there is a projection onto a sphere and (ii)~the sphere is plaited onto the projection plane.} \label{spheproj} \end{figure} } \subsection{Bugs} \frame{ \changeableframetitle{Bugs} It is important to keep in mind that some capabilities of \FP, although usable, may be considered ``buggy'' or only partially implemented. These include the drawing of cylinders with holes, as in figure \ref{buggydisc}. } \frame{ \begin{figure}[hbtp] \begin{center} \includegraphics[width=65mm]{fakehole.1} \end{center} \caption{\FP\ example containing a \myem{rigorousdisc} with five holes, four of which are fake.} \label{buggydisc} \end{figure} } \subsection{Moving on, slowly} \frame{ \changeableframetitle{Moving on} It is highly beneficial to be able to understand and cope with \MP\ error messages as \FP\ has no protection against mistaken inputs. One probable cause of errors is the use of variables with the name of procedures (macros), like \begin{quote} \begin{alltt} X, Y, Z, W, N, rp, cb, ps, vp \end{alltt} \end{quote} All other procedure names have six or more characters. } \frame{ The user must be aware that \MP\ has a limited arithmetic power and that the author has limited programming skills, which may lead to unperfect 3D figures, very long processing time or shear bugs. It's advisable not to try very complex diagrams at first and it's recommended to keep 3D coordinates near order 1 (default \MP\ units). } \frame{ All three-dimensional \FP\ macros are build apon the \MP\ \myem{color} variable type. It looks like this: \begin{quote} \begin{alltt} (red,green,blue) \end{alltt} \end{quote} Its components may, nevertheless, be arbtitrary numbers, like: \begin{quote} \begin{alltt} (X,Y,Z) \end{alltt} \end{quote} So, the \myem{color} type is adequate to define not only colors but also 3D points and vectors. } \frame{ \changeableframetitle{Hello world} One very minimalistic example program could be: \begin{quote} \begin{alltt} input featpost3Dplus2D; beginfig(1); cartaxes(1,1,1); endfig; end. \end{alltt} \end{quote} where \myem{cartaxes} is a \FP\ macro that produces the Cartesian reference frame with axis labels. } \frame{ The main variable of any three-dimensional figure is the point of view. \FP\ uses the variable \myem{f} as the point of view. \myem{Spread} is another global variable that controls the size of the projection. Therefore the minimalistic program above should also contain, for example: \begin{quote} \begin{alltt} f:=(6,1,3); Spread:=40; \end{alltt} \end{quote} } \subsection{Why \FP?} \frame{ \changeableframetitle{Why \FP?} \FP\ is good enough to produce scientific diagrams: \begin{itemize} \item Figure 1 of \href{http://pre.aps.org/abstract/PRE/v60/i3/p2985_1}{\textit{Phys. Rev. E}, \textbf{60}, 2985-2989 (1999)}. \item Figures 4, 6 and 8 of \href{http://www.springerlink.com/content/pmwu8a2y9pkxr5rq/}{\textit{Eur. Phys. J. E}, \textbf{2}, 351-358 (2000)}. \item Figures 8 and 12 of \href{http://www.springerlink.com/content/w41308176vnk7408/}{\textit{Eur. Phys. J. E}, \textbf{20}, 55-61 (2006)}. \end{itemize} } \subsection{A small subset of features} \subsubsection{Angles} \frame{ \changeableframetitle{Angles} Some problems often require defining angles, and diagrams are needed to visualize their meanings. The \myem{angline} and \myem{squareangline} macros support this (see figure \ref{figcartaxes2}). } \frame{ \begin{figure}[hbtp] \begin{center} \includegraphics[width=65mm]{cartaxes.2} \end{center} \caption{Example that uses \myem{cartaxes}, \myem{squareangline}, \myem{angline} and \myem{getangle}.} \label{figcartaxes2} \end{figure} } \subsubsection{Parametric lines} \frame{ \changeableframetitle{Parametric lines} Visualizing parametric lines is another need. When two lines cross, one should be able to see which line is in front of the other. The macro \myem{emptyline} can help here (see figure \ref{induction}). } \frame{ \begin{figure}[hbtp] \begin{center} \includegraphics[width=65mm]{parafuso.1} \end{center} \caption{\FP\ diagram using \myem{emptyline}.} \label{induction} \end{figure} } \subsubsection{Curved solids} \frame{ \changeableframetitle{Curved solids} \begin{sloppypar} Some curved surface solid objects can be drawn with \FP. Among them are cones (\myem{very\-good\-cone}), cylinders (\myem{rigorous\-disc}) and globes (\myem{trop\-ical\-globe}). These can also cast their shadows on a horizontal plane (see figure \ref{anddisc}). The production of shadows involves the global variables \myem{LightSource}, \myem{ShadowOn} and \myem{HoriZon}. \end{sloppypar} } \frame{ \begin{figure}[hbtp] \begin{center} \includegraphics[width=65mm]{stageforthree.3} \end{center} \caption{\FP\ diagram using the macros \myem{rigorousdisc}, \myem{verygoodcone}, \myem{tropicalglobe} and \myem{setthestage}.} \label{anddisc} \end{figure} } \subsubsection{Fat sticks} \frame{ \changeableframetitle{Fat sticks} One feature that merges 2D and 3D involves what might be called ``fat sticks''. A fat stick resembles the Teflon magnets used to mix chemicals. They have volume but can be drawn like a small straight line segment stroked with a big \myem{pencircle}. Fat sticks may be used to represent direction fields (unitary vector fields without arrows). See figure \ref{nsmetica}. } \frame{ \begin{figure}[hbtp] \begin{center} \includegraphics[width=65mm]{nsmetica.1} \end{center} \caption{\FP\ direction field macro \myem{director\_invisible} was used to produce this representation of the molecular structure of a Smectic A liquid crystal.} \label{nsmetica} \end{figure} } \subsubsection{From 3D to 2D} \frame{ \changeableframetitle{From 3D to 2D} The most important macro is \myem{rp} that converts 3D points to two-dimensional (2D) rigorous, orthogonal or fish-eye projections. To draw a line in 3D-space try \begin{quote} \begin{alltt} draw rp(a)--rp(b); \end{alltt} \end{quote} where \myem{a} and \myem{b} are points in space (of \myem{color} type). } \frame{ \changeableframetitle{``Straight lines''} But if you're going for fish-eye it's better to \begin{quote} \begin{alltt} draw pathofstraightline(a,b); \end{alltt} \end{quote} If you don't know, leave it as \begin{quote} \begin{alltt} drawsegment(a,b); \end{alltt} \end{quote} } \subsubsection{Intersections} The most advanced feature of \FP\ is the ability to calculate the intersections of planar and convex polygons\footnote{Unfortunately, this is also the most "bugged" feature.}. It can draw the visible part of arbitrary sets of polygons as in the following program: \begin{quote} \begin{alltt} input featpost3Dplus2D; numeric phi; phi = 0.5*(1+sqrt(5)); V1 := ( 1, phi,0);V2 := (-1, phi,0); V3 := (-1,-phi,0);V4 := ( 1,-phi,0); V5 := (0, 1, phi);V6 := (0,-1, phi); V7 := (0,-1,-phi);V8 := (0, 1,-phi); V9 := ( phi,0, 1);V10:= ( phi,0,-1); V11:= (-phi,0,-1);V12:= (-phi,0, 1); makeface1(1,2,3,4);makeface2(5,6,7,8); makeface3(9,10,11,12); beginfig(1); sharpraytrace; endfig; end \end{alltt} \end{quote} See figure \ref{figsharpraytrace}. \frame{ \begin{figure}[bpt] \begin{center} \includegraphics[width=65mm]{sharpraytrace.1} \end{center} \caption{Intersecting polygons drawn with the macro \myem{sharpraytrace}.} \label{figsharpraytrace} \end{figure} } \subsubsection{Coming back to 3D from 2D} \frame{ \changeableframetitle{Coming back to 3D from 2D} It is possible to do an "automatic perspective tuning" with the aid of macro \myem{photoreverse}. Please, refer both to example \myem{photoreverse.mp} (see figure \ref{figphotoreverse}) and to the following web page: \href{http://matagalatlante.org/nobre/hyt/technicaldrawfromphoto.html}{FeatPost Deeper Technicalities}. } \frame{ \begin{figure}[bpt] \begin{center} \includegraphics[width=0.45\columnwidth]{photoreverse.1} \end{center} \caption{Example that uses \myem{photoreverse}. It may not work when vertical lines are not vertical in average on the photo.} \label{figphotoreverse} \end{figure} } The idea here is to: (i) have a \MP-coded vectorized image; (ii) associate 3D coordinates to a few specific points of the vectorized image; (iii) use \myem{photoreverse} to obtain the perspective parameters corresponding to the image; and (iv) use those perspective parameters to draw 3D matching schematic diagrams on the image. \subsubsection{Coming back to 3D from 1D} \frame{ \changeableframetitle{Coming back to 3D from 1D} Using almost the same algorithm as \myem{photoreverse}, the macro \myem{improvertex} allows one to approximate a point in 3D-space with given distances $d$ from three other points (an initial guess $\vec{i}$ is required). \begin{center} \myem{point := improvertex}( $\vec{a}$, $d_a$, $\vec{b}$, $d_b$, $\vec{c}$, $d_c$, $\vec{i}$ ); \end{center} } \frame{ \changeableframetitle{\myem{ultraimprovertex}} Approximating a point in 3D-space with given distances from three other points is the same as calculating the intersection of three spheres. And the method to do that is the same as the method to calculate the intersection of a plane, a cylinder and a spheroid (see figure \ref{figultraimprove}). } \frame{ \begin{figure}[bpt] \begin{center} \includegraphics[width=0.45\columnwidth]{ultraimprovertex.1} \end{center} \caption{Example that uses \myem{ultraimprovertex}.} \label{figultraimprove} \end{figure} } \subsubsection{Scalar function minimization} \frame{ \changeableframetitle{Scalar function minimization} Macro \myem{minimizestep} is a minimization routine for scalar functions like $y=f(x)$ where an initial triplet $(x_1,x_2,x_3)$ with $x_1{\frame{ \changeableframetitle{The features} 3D dots, vectors, flat and curved arrows, angles, parametric lines, circles and ellipses, cuboids, cones, cylinders, cylindric holes, parts of cylindrical surfaces, spheres and spheroids, globes, hemispheres, tora, elliptical frusta, revolution paraboloids, polygons, polyhedra, functional and parametric surfaces, direction fields, field lines and trajectories in vector fields (differential equations), schematic automobiles, schematic electric charges, automatic perspective tuning, 2D representation of ropes, reference horizontal surfaces, hexagonal plots, schematic 2D springs, zig--zag lines, irregular circles, selective intersection of two circles, 2D detection of tangency, paths for laser cutting machines, minimization of scalar functions, intersection of 2D areas, intersection point of three spheres, intersection point of a plane, a cylinder and a spheroid, intersection of a straight line and a spheroid, intersection of a straight line and a torus. And much more. }} \section{Reference Manual} Some words about notation. The meaning of macro, function, procedure and routine is the same. Global variables are presented like this: \begin{quote} \begin{alltt} vartype var, anothervar anothervartype yetanothervar \end{alltt} \end{quote} Explanation of \myem{var}, \myem{anothervar} and \myem{yetanothervar}. \myem{vartype} can be any one of \MP\ types but the meaning of \myem{color} is a three-dimensional point or vector, not an actual color like yellow, black or white. If the meaning is an actual color then the type will be \myem{colour}. Most of the global variables have default values. Functions are presented like this: \begin{itemize} \item returntype {\bfseries function()} Explanation of this function. ``returntype'' can be any one of \MP\ types plus global, draw, drawlabel or MD. ``global'' means that the function changes some of the global variables. ``draw'' means that the function changes the currentpicture. ``drawlabel'' means that the function changes the currentpicture and adds text to it. ``MD'' means that the returntype is the same as the type of the arguments (1, 2, 3 or 4D, that is \myem{numeric}, \myem{pair}, \myem{color} or \myem{cmykcolor}). \begin{enumerate} \item \myem{type1} Explanation of the first argument. The type of one argument can be any one of \MP\ types plus \myem{suffix} or \myem{text}. \item \myem{type2} Explanation of the second argument. There is the possibility that the function has no arguments. In that case the function is presented like "\myem{returntype} {\bfseries function}". \item Etc. \end{enumerate} \end{itemize} \subsection{Global variables} \begin{quote} \begin{alltt} boolean ParallelProj boolean SphericalDistortion boolean MalcomX \end{alltt} \end{quote} Kind of projection calculated by \myem{rp}. By default projections are rigorous but if \myem{ParallelProj} is set \myem{true} then parallel lines remain parallel in the projection. It is the same as placing the point of view infinitely far without loosing sight. If \myem{SphericalDistortion} is set \myem{true} there will be a distortion coming from: (i) the projection being done on a sphere of center \myem{f} and (ii) this sphere being plaited onto the paper page. When \myem{MalcomX} is set \myem{true}, perspectives are calculated with the x coordinate (first coordinate) replaced by the fourth coordinate. The idea here is to use the fourth coordinate as ``time'' and visualize yz projections of an animation in a single figure\footnote{To be developed in future versions.}. \frame{ \begin{figure}[bpt] \begin{center} \includegraphics[width=65mm]{rigorousdiscSD.1} \end{center} \caption{Figure that uses \myem{SphericalDistortion:=true} and \myem{rigorousdisc}.} \label{sphericaldisc} \end{figure} } \begin{quote} \begin{alltt} color f, viewcentr \end{alltt} \end{quote} The point of view is \myem{f}. The plane or sphere of projection contains the center of view \myem{viewcentr}. The axis, parallel to zz, that contains the \myem{viewcentr} is projected on a vertical line. \begin{quote} \begin{alltt} numeric MaxFearLimit \end{alltt} \end{quote} The above variable defines the maximum allowed 3D distance between \myem{viewcentr} and the projection of a point as calculated by \myem{rp} (remember that 3D distances have no units). Everything located beyond this maximum is compressed into a circumference. \begin{quote} \begin{alltt} numeric Spread pair ShiftV, OriginProjPagePos numeric PageWidth numeric PageHeight \end{alltt} \end{quote} These variables control the placement of the projection on the paper. \myem{Spread} is the magnification and \myem{ShiftV} is the position of the \myem{viewcentr} projection on the paper. But, if at some point in your program you introduce \myem{produce\_auto\_scale} then the \myem{currentpicture} will be centered at \myem{OriginProjPagePos} and scaled to fit inside a rectangle of \myem{PageWidth} by \myem{PageHeight}. \begin{quote} \begin{alltt} color V[] color L[]p[] color F[]p[] \end{alltt} \end{quote} Vertexes, lines and faces. The idea here is to draw polygons and/or arbitrary lines in 3D space. Defining the polygons and the lines can be a bit tedious as \FP\ is not interactive\footnote{The lines could become the skeleton of NURBS.}. First, one defines a list of the vertexes (\myem{V[]}) that define the polygons and/or the lines. There is a list of polygons and a list of lines. Each polygon (\myem{F[]p[]}) or line (\myem{L[]p[]}) is itself a list of vertexes. All vertexes of the same poligon should belong to the same plane. \begin{quote} \begin{alltt} numeric NL numeric npl[] numeric NF numeric npf[] \end{alltt} \end{quote} Number of lines, number of vertexes of each line, number of faces, number of vertexes of each face. \begin{quote} \begin{alltt} numeric PrintStep \end{alltt} \end{quote} \myem{Printstep} is the size of iterative jumps along lines. Used by \myem{lineraytrace}, \myem{faceraytrace} and \myem{pathofstraightline}. Big \myem{Printstep}s make fast \myem{lineraytrace}ings. \begin{quote} \begin{alltt} boolean FCD[] colour TableC[] numeric TableColors numeric FC[] colour HigColor colour SubColor color LightSource \end{alltt} \end{quote} \myem{FCD} means "face color defined". The \myem{draw\_invisible} macro draws polygons in colour, if it is defined. The colour must be selected from the table of colours \myem{TableC} that has as many as \myem{TableColors}. The colour \myem{FC} of each polygon will depend on its position relatively to \myem{LightSource} where we suppose there is a lamp that emits light coloured \myem{HigColor}. Furthermore the colour of each polygon may be modified if it belongs to a functional or parametric surface. In this case, if we are looking at the polygon from below than \myem{SubColor} is subtracted from its colour. \begin{quote} \begin{alltt} numeric RopeColorSeq[] numeric RopeColors \end{alltt} \end{quote} The above variables are used by \myem{ropepattern}. \begin{quote} \begin{alltt} numeric TDAtiplen numeric TDAhalftipbase numeric TDAhalfthick \end{alltt} \end{quote} The above variables control the shape of Three-Dimensional Arrows. \begin{quote} \begin{alltt} boolean ShadowOn numeric HoriZon \end{alltt} \end{quote} When \myem{ShadowOn} is set \myem{true}, some objects can cast a black shadow on a horizontal plane of \myem{Z} coordinate equal to \myem{HoriZon} (an area from this plane may be drawn with \myem{setthestage} or with \myem{setthearena}) as if there is a punctual source of light at \myem{LightSource}. The macros that can produce shadows, in addition to their specific production, are \begin{itemize} \item \myem{emptyline} \item \myem{rigorousdisc} \item \myem{verygoodcone} \item \myem{tropicalglobe} \item \myem{positivecharge} \item \myem{whatisthis} \item \myem{spheroid} \item \myem{ellipsoid} \item \myem{kindofcube} \item \myem{draw\_all\_test} \item \myem{fill\_faces} \item \myem{smoothtorus} \end{itemize} All macros that contain {\bfseries shadow} in their name calculate the location of shadows using \myem{cb}. These are: \myem{circleshadowpath}; \myem{signalshadowvertex}; \myem{ellipticshadowpath}; \myem{circleshadowpath}; \myem{spheroidshadow}; \myem{ellipsoidshadow}; \myem{torushadow}; \myem{rigorousfearshadowpath}; and \myem{faceshadowpath}. \begin{quote} \begin{alltt} path VGAborder \end{alltt} \end{quote} This path and the macro \myem{produce\_vga\_border} are meant to help you clip the \myem{currentpicture} to a 4:3 rectangle as in a (old) movie frame. \begin{quote} \begin{alltt} pair PhotoPair[] color PhotoPoint[] numeric PhotoMarks \end{alltt} \end{quote} The above variables are used by \myem{photoreverse}. \begin{quote} \begin{alltt} pen ForePen, BackPen path CLPath numeric NCL \end{alltt} \end{quote} The above variables are used by \myem{closedline}. \begin{quote} \begin{alltt} boolean OverRidePolyhedricColor string ostr[] numeric ActuC, Nobjects, RefDist[] \end{alltt} \end{quote} \myem{OverRidePolyhedricColor} is used by \myem{fillfacewithlight}. \myem{Nobjects}, \myem{ostr} and \myem{RefDist[]} are auxiliary variables used by \myem{getready} and \myem{doitnow}. \myem{Actuc} is used both by \myem{hexagonaltrimesh} and by \myem{partrimesh}. \subsection{Definitions} \begin{itemize} \item global makeline@\#( text1) \item global makeface@\#( text1) \end{itemize} Both of these functions ease the task of defining lines and polygons. Just provide a list of vertexes in a correct sequence for each polygon and/or line. Suppose a tetrahedron \begin{quote} \begin{alltt} V3:=(+1,-1,-1);V2:=(-1,+1,-1); V4:=(+1,+1,+1);V1:=(-1,-1,+1); makeface2(1,2,3);makeface3(1,2,4); makeface1(3,4,1);makeface4(3,4,2); \end{alltt} \end{quote} The number in the last makeface or last makeline procedure name must be the number of polygons or lines. All polygons and lines from 1 upto this number must be defined but the sorting may be any of your liking. \subsection{Macros} \subsubsection{Very Basic Macros} \begin{itemize} \item numeric {\bfseries X()} Returns the first coordinate of a point or vector (triplet of color type) if \myem{MalcomX} is false but returns the fourth coordinate of a tetraplet (of cmykcolor type) if \myem{MalcomX} is true. \item numeric {\bfseries Y()} Returns the second coordinate of a point or vector. Replaces \myem{greenpart}. \item numeric {\bfseries Z()} Returns the third coordinate of a point or vector. Replaces \myem{bluepart}. \item numeric {\bfseries W()} Returns the fourth coordinate of a 4D point or vector. Replaces \myem{blackpart}. \item cmykcolor {\bfseries makecmyk()} Produces a tetraplet from a triplet and a scalar. \item color {\bfseries maketrio()} This is, in fact, a projection from 4D into 3D. The single input is a tetraplet and the output is a triplet (the fourth coordinate is discarded). The output triplet takes in consideration the value of \myem{MalcomX} (see \myem{X}). \item draw {\bfseries produce\_auto\_scale} The currentpicture is centered in, and adjusted to the size of, an A4 paper page. This avoids the control of \myem{Spread} and \myem{ShiftV}. \item string {\bfseries cstr()} Converts a color into its string. Usefull in combination with \myem{getready}. \item string {\bfseries bstr()} Converts a boolean expression into its string. Usefull in combination with \myem{getready}. \end{itemize} \subsubsection{Vector Calculus} \begin{itemize} \item color {\bfseries N()} Unit vector. Returns \myem{black} (the null vector) when the argument has null norm. The "N" means "normalized". \item numeric {\bfseries cdotprod()} Dot product of two vectors. \item color {\bfseries ccrossprod()} Cross product of two vectors. \item numeric {\bfseries ndotprod()} Cossine of the angle beetween two vectors. \item color {\bfseries ncrossprod()} Normalized cross product of twovectors. \item numeric {\bfseries conorm()} Euclidean norm of a vector. \item numeric {\bfseries cmyknorm()} Euclidean norm of a 4D vector. Should not be used when \myem{MalcomX} is \myem{true}. \item numeric {\bfseries getangle()} Angle beetween two vectors. \item numeric {\bfseries getcossine()} Cossine of the angle between segment A and segment B, where A connects \myem{f} and the center of a sphere, and where B contains \myem{f} and is tangent to that sphere. \item pair {\bfseries getanglepair()} Orientation angles of a vector. The first angle (\myem{xpart}) is measured beetween the vector projection on the \myem{XY} plane and the \myem{X} axis. The second angle (\myem{ypart}) is measured beetween the vector and its projection on the \myem{XY} plane. This may be usefull to find the arguments of \myem{kindofcube} \item color {\bfseries eulerrotation()} Three-dimensional rotation of a vector. See the figure \ref{kindofcube2} to visualize the following movement: (i) grab the \myem{X} component of the vector; (ii) rotate it on the \myem{XY} plane as much as the first argument; (iii) raise it up as much as the second argument; and (iv) turn it around as much as the third argument. \begin{enumerate} \item \myem{numeric} Angle of rotation around the \myem{Z} component. \item \myem{numeric} Angle of rotation around the rotated \myem{Y} component. \item \myem{numeric} Angle of rotation around the two times rotated \myem{X} component. \item \myem{color} Vector to be rotated. \end{enumerate} \item color {\bfseries randomfear} Generates a randomly oriented unit vector. \item MD {\bfseries planarrotation($\vec{A},\vec{B},\theta$)} $=\vec{A}\cos\theta+\vec{B}\sin\theta$ \item color {\bfseries rotvecaroundanother} Rotates a vector around another. \begin{enumerate} \item \myem{numeric} Angle of rotation around the fixed vector. \item \myem{color} Vector to be rotated. \item \myem{color} Fixed vector. \end{enumerate} \end{itemize} \subsubsection{Projection Macros} \begin{itemize} \item pair {\bfseries rp()} Converts spatial positions into planar positions on the paper page. The conversion considers the values of the following global variables: \myem{viewcentr}, \myem{ParallelProj}, \myem{SphericalDistortion}, \myem{Spread}, \myem{ShiftV} and \myem{MaxFearLimit}. When both \myem{ParallelProj} and \myem{SphericalDistortion} are \myem{false} it won't work if either (i) the vectors \myem{f-viewcentr} and \myem{f-R} are perpendicular (\myem{R} is the argument) or (ii) \myem{f} and \myem{viewcentr} share the same \myem{X} and \myem{Y} coordinates. \begin{enumerate} \item \myem{color} Spatial position. \end{enumerate} \item pair {\bfseries vp()} Converts spatial directions into planar positions on the paper page. These positions are the vanishing points of those directions. The conversion considers the values of the same global variables as \myem{rp}. \begin{enumerate} \item \myem{color} Spatial direction. \end{enumerate} \item color {\bfseries cb()} Calculates the position of the shadow of a point. Uses \myem{HoriZon} and \myem{LightSource}. \begin{enumerate} \item \myem{color} Point position. \end{enumerate} \item color {\bfseries projectpoint()} Calculates the intersection beetween a plane and a straight line. The plane contains a given point and is perpendicular to the line connecting the \myem{LightSource} and this same point. The line is defined by another given point and the \myem{LightSource}. Summary: \myem{projectpoint} returns the projection of the second argument on a plane that contains the first argument. Can be used to draw shadows cast on generic planes. \begin{enumerate} \item \myem{color} Origin of the projection plane. \item \myem{color} Point to be projected. \end{enumerate} \item color {\bfseries lineintersectplan()} Calculates the intersection beetween a generic plane and a straight line. The plane contains a given point and is perpendicular to a given vector. The line contains a given point and is parallel to a given vector. \begin{enumerate} \item \myem{color} Point of the line. \item \myem{color} Vector parallel to the line. \item \myem{color} Point of the projection plane. \item \myem{color} Vector perpendicular to the projection plane. \end{enumerate} \item numeric {\bfseries ps()} Used by \myem{signalvertex}. \end{itemize} \subsubsection{Plain Basic Macros} \begin{itemize} \item draw {\bfseries signalvertex()} Draws a dot sized inversely proportional to its distance from the viewpoint \myem{f}. \begin{enumerate} \item \myem{color} Location. \item \myem{numeric} Factor of proportionality ("size of the dot"). \item \myem{colour} Colour of the dot. \end{enumerate} \frame{ \begin{figure}[bpt] \begin{center} \includegraphics[width=65mm]{torus.1} \end{center} \caption{Figure that uses \myem{signalvertex}.} \end{figure} } \item path {\bfseries pathofstraightline()} When using \myem{SphericalDistortion:=true}, straight lines look like curves. This macro returns the curved path of a straight line beetween two points. This path will have a greater \myem{length} ("time") when \myem{PrintStep} is made smaller. \item draw {\bfseries drawsegment()} Alternative \myem{pathofstraightline} that avoids the calculation of all the intermediate points when \myem{SphericalDistortion:=false}. \item drawlabel {\bfseries cartaxes()} Cartesean axis with prescribed lenghtes and apropriate labels. \begin{enumerate} \item \myem{numeric} Length of the \myem{X} axis. \item \myem{numeric} Length of the \myem{Y} axis. \item \myem{numeric} Length of the \myem{Z} axis. \end{enumerate} \item drawlabel {\bfseries orthaxes()} Cartesean axis with prescribed lenghtes and prescribed labels. \begin{enumerate} \item \myem{numeric} Length of the \myem{X} axis. \item \myem{label} Label of the \myem{X} axis. \item \myem{numeric} Length of the \myem{Y} axis. \item \myem{label} Label of the \myem{Y} axis. \item \myem{numeric} Length of the \myem{Z} axis. \item \myem{label} Label of the \myem{Z} axis. \end{enumerate} \item draw {\bfseries emptyline()} This procedure produces a sort of a tube that can cross over itself. It facilitates the drawing of, for instance, thick helical curves but it won't look right if the curves are drawn getting apart from the point of view. Please, accept this inconveniance. As like many other \FP\ macros this one can produce visually correct diagrams only in limited conditions. Can cast a shadow. \begin{enumerate} \item \myem{boolean} Choose \myem{true} to join this line with a previously drawn line. \item \myem{numeric} Factor of proportionality ("diameter of the tube"). The tubes are just sequences of dots drawn by \myem{signalvertex}. \item \myem{colour} Colour of the tube border. \item \myem{colour} Colour of the tube. \item \myem{numeric} Total number of dots on the tube line. \item \myem{numeric} Fraction of the tube diameter that is drawn with the tube colour. \item \myem{numeric} This is the number of dots that are redrawn with the colour of the tube for each drawn dot with the color of the tube border. Usually 1 or 2 are enough. \item \myem{text} This is the name a function that returns a 3D point of the line for each value of a parameter in beetween 0 and 1. \end{enumerate} \frame{ \begin{figure}[bpt] \begin{center} \includegraphics[width=65mm]{joinedemptylines.1} \end{center} \caption{Figure that uses \myem{emptyline}. The junction point of two different lines is indicated by an arrow. } \label{joinedemptylines} \end{figure} } \item draw {\bfseries closedline()} This procedure produces a tube that can cross over itself. It facilitates the drawing of, for instance, thick helical curves but it won't look right as its thickness does not change with the distance from the point of view. The drawing is entirely done in two dimensions, so the tube diameter depends on the global variables \myem{ForePen} and \myem{BackPen}. There can be more than one line in a figure but all get the same diameter. When calling \myem{closedline()} in different figures of the same program you must reinitialize both \myem{NCL} and \myem{Nobjects} (because \myem{closedline()} uses \myem{getready()}). \begin{enumerate} \item \myem{boolean} Value of "the line is closed". \item \myem{numeric} Total number of path segments on the tube line. \item \myem{numeric} Use 0.5 or more. \item \myem{numeric} Use 0.75 or more. \item \myem{text} This is the name of a function that returns a 3D point of the line for each value of a parameter in beetween 0 and 1. \end{enumerate} \item drawlabel {\bfseries angline()} Draws an arch beetween two straight lines with a common point and places a label near the middle of the arch (marks an angle). Note that the arch is not circular. \begin{enumerate} \item \myem{color} Point of one line. \item \myem{color} Point ot the other line. \item \myem{color} Common point. \item \myem{numeric} Distance beetween the arch and the common point. \item \myem{picture} Label. \item \myem{suffix} Position of the label relatively to the middle of the arch. May be one of \myem{lft, rt, top, bot, ulft, urt, llft} and \myem{lrt}. \end{enumerate} \item drawlabel {\bfseries anglinen()} The same as the previous function but the sixth argument is numeric: 0=\myem{rt}; 1=\myem{urt}; 2=\myem{top}; 3=\myem{ulft}; 4=\myem{lft}; 5=\myem{llft}; 6=\myem{bot}; 7=\myem{lrt}; any other number places the label on the middle of the arch. \item draw {\bfseries squareangline()} This is supposed to mark 90 degree angles but works for any angle value. \begin{enumerate} \item \myem{color} Point of one line. \item \myem{color} Point ot the other line. \item \myem{color} Common point. \item \myem{numeric} Distance beetween the "arch" and the common point. \end{enumerate} \item path {\bfseries rigorouscircle()} 3D circle. The total "time" of this path is 8. This small number makes it easy to select parts of the path. The circle is drawn using the "left-hand-rule". If you put your left-hand thumb parallel the circle axis then the other left-hand fingers curl in the same sense as the circle path. This path allways starts, approching the view point, from a point on a diameter of the circle that projects orthogonaly to its axis, and rotating around the axis in the way of the left-hand-rule. \begin{enumerate} \item \myem{color} Center of the circle. \item \myem{color} Direction orthogonal to the circle (circle axis). \item \myem{numeric} Radius of the circle. \end{enumerate} \frame{ \begin{figure}[bpt] \begin{center} \includegraphics[width=0.45\columnwidth]{anglinerigorouscircle.1} \end{center} \caption{Figure that uses \myem{anglinen} and \myem{rigorouscircle}.} \end{figure} } \item draw {\bfseries tdarrow()} Draws a flat arrow that begins at the first argument and ends at the second. The shape of the arrow is controled by the global variables \myem{TDAtiplen, TDAhalftipbase, TDAhalfthick}. This arrow is drawn on the plane that maximizes the perspective of its width. Also, the tip is contracted when \myem{TDAtiplen} is larger than the length of the arrow. \item draw {\bfseries tdcircarrow()} Draws a flat curving arrow. The curve is a circular arch on a plane. The shape of the arrow is controled both by the global variables \myem{TDAtiplen, TDAhalftipbase, TDAhalfthick} and by the three last arguments. \begin{enumerate} \item \myem{color} Position of the center ($\vec{c}$). \item \myem{color} Vector perpendicular to the plane $P$ that contains the arrow (rotation axis $\vec{A}$). \item \myem{numeric} Curve ray. \item \myem{numeric} Arrow starting angle. Note that the angle is measured relative to the axis pointing from $\vec{c}$ to \myem{f} and projected onto $P$ ($\vec{B}$). The angle is positive when it approaches $\vec{A}\times\vec{B}$. \item \myem{numeric} Angular amplitude of the curve (may be negative). \end{enumerate} \frame{ \begin{figure}[bpt] \begin{center} \includegraphics[width=0.45\columnwidth]{tdcircarrow.1} \end{center} \caption{Figure that uses \myem{tdarrow} and \myem{tdcircarrow}.} \end{figure} } \item path {\bfseries twocyclestogether()} This macro allows you to draw any solid that has no vertexes and that has two, exactly two, planar cyclic edges. In fact, it doesn't need to be a solid. Just provide the pathes of both cyclic edges as arguments but note that the returned path is polygonal. In order to complete the drawing of this solid you have to choose one of the edges to be drawn immediatly afterwards. This is done automatically by the \myem{whatisthis} macro for the case of two parallel and concentric ellipses. \item path {\bfseries ellipticpath()} Produces an elliptic path in 3D space. \begin{enumerate} \item \myem{color} Position of the center. \item \myem{color} Major or minor axis. \item \myem{color} The other axis. \end{enumerate} \item drawlabel {\bfseries labelinspace()} Draw some 2D \myem{picture} on some 3D plane (only when \myem{ParallelProj:=true}). Just \myem{Transform}s the label in the same way as its bounding box, that is, the same way as two perpendicular sides of its bounding box. This is only exact for parallel perspectives. \begin{enumerate} \item \myem{color} Position for the lower-left corner. \item \myem{color} Orientation of the picture's bottom edge. \item \myem{color} Orientation of the picture's letf edge. \item \myem{text} 2D picture's name. \end{enumerate} \frame{ \begin{figure}[bpt] \begin{center} \includegraphics[width=65mm]{labelinspace.1} \end{center} \caption{Example that uses \myem{labelinspace}.} \end{figure} } \end{itemize} \subsubsection{Standard Objects} \begin{itemize} \item path {\bfseries goodcirclepath()} Another 3D circle macro. More rigorous than \myem{rigorouscircle} but when the direction ortogonal to the circle is almost orthogonal to the line \myem{viewpoint--center} it doesn't work correctly. The total "time" of this path is 36. \begin{enumerate} \item \myem{color} Center of the circle. \item \myem{color} Direction ortogonal to the circle. \item \myem{numeric} Radius of the circle. \end{enumerate} \item draw {\bfseries spatialhalfsfear()} An hemisphere. Doesn't work with \myem{f} inside it. \begin{enumerate} \item \myem{color} Center. \item \myem{color} Vector ortogonal to the frontier circle and pointing out of the concavity. \item \myem{numeric} Radius of the (hemi)sphere. \end{enumerate} \item path {\bfseries spatialhalfcircle()} And yet another 3D circle macro. Only the visible or the hidden part. This is usefull to mark sections of cylinders or spherical major circles. \begin{enumerate} \item \myem{color} Center of the circle. \item \myem{color} Direction ortogonal to the circle. \item \myem{numeric} Radius of the circle. \item \myem{boolean} The visible part is selected with \myem{true} and the hidden with \myem{false}. \end{enumerate} \item draw {\bfseries rigorousdisc()} 3D opaque cylinder with/without a hole. Can cast a shadow (without the hole). \begin{enumerate} \item \myem{numeric} Ray of an axial hole. \item \myem{boolean} Option for completly opaque cylinder (\myem{true}) or partial pipe (\myem{false}) when there is no hole. When the cylinder has an hole this option should be \myem{true}. \item \myem{color} Center of one circular base. \item \myem{numeric} Radius of both circular bases. \item \myem{color} Vector that defines the length and orientation of the cylinder. The addition the third and fifth arguments should give the position of the center of the other circular base. \end{enumerate} \item draw {\bfseries verygoodcone()} 3D cone. Can cast a shadow. \begin{enumerate} \item \myem{bolean} Option to draw dashed evenly the invisible edge (\myem{true}) or not (\myem{false}). \item \myem{color} Center of the circular base. \item \myem{color} Direction ortogonal to the circular base. \item \myem{numeric} Radius of the circular base. \item \myem{color} Position of the vertex \end{enumerate} \item path {\bfseries rigorousfearpath()} 3D sphere. Simple but hard. \begin{enumerate} \item \myem{color} Center position. \item \myem{numeric} Radius. \end{enumerate} \item draw {\bfseries tropicalglobe()} Globe with minor circles. Can cast a shadow. \begin{enumerate} \item \myem{numeric} Number of marked latitudes. \item \myem{color} Center position. \item \myem{numeric} Radius \item \myem{color} Axis orientation. \end{enumerate} \frame{ \begin{figure}[bpt] \begin{center} \includegraphics[width=65mm]{tropicalglobe.1} \end{center} \caption{Figure that uses \myem{tropicalglobe}.} \end{figure} } \item draw {\bfseries spheroid()} Revolution ellipsoid. Can cast a shadow. \begin{enumerate} \item \myem{color} Center position. \item \myem{color} Position of one pole relative to the center. \item \myem{numeric} Radius \end{enumerate} \frame{ \begin{figure}[bpt] \begin{center} \includegraphics[width=65mm]{revolipsoid.2} \end{center} \caption{Figure that uses \myem{spheroid}.} \end{figure} } \item draw {\bfseries whatisthis()} An elliptic frustum. Both edges are elliptic an have the same orientation but one may be greater than the other. Can cast a shadow. \begin{enumerate} \item \myem{color} Reference edge center. \item \myem{color} Major or minor axis. \item \myem{color} The other axis. \item \myem{numeric} Length of the original cylinder. \item \myem{numeric} Edges axis length ratio. \end{enumerate} \item draw {\bfseries kindofcube()} Polyhedron with six orthogonal faces (cuboid). \begin{enumerate} \item \myem{boolean} Also draw the invisible edges \myem{dashed evenly} (\myem{true}) or do not. \item \myem{boolean} The reference point may be a vertex (\myem{true}) or the center(\myem{false}). \item \myem{color} Reference point. \item \myem{numeric} Alpha1. \item \myem{numeric} Alpha2. \item \myem{numeric} Alpha3. \item \myem{numeric} L1. Length of the first side. \item \myem{numeric} L2. Length of the second side. \item \myem{numeric} L3. Length of the third side. \end{enumerate} These arguments are represented in figure \ref{kindofcube2}. \frame{ \begin{figure}[bpt] \begin{center} \includegraphics[width=65mm]{kindofcube.2} \end{center} \caption{Figure that uses and explains \myem{kindofcube}. Note that the three indicated angles may be used as arguments of \myem{eulerrotation}.} \label{kindofcube2} \end{figure} } \item draw {\bfseries setthestage()} Produces an horizontal square made of squares. Its \myem{Z} coordinate is defined by \myem{HoriZon}. \begin{enumerate} \item \myem{numeric} Number of squares in each side. \item \myem{numeric} Size of each side. \end{enumerate} \item draw {\bfseries setthearena()} Produces an horizontal circle made of circles. Its \myem{Z} coordinate is defined by \myem{HoriZon}. Due to the fact that the center of a circle is not on the center of its central perspective projection, this may look a bit strange. \begin{enumerate} \item \myem{numeric} Number of circles on a diameter. \item \myem{numeric} Diameter. \end{enumerate} \item draw {\bfseries smoothtorus()} Toxic donut (not to be eaten). Produces an error message when \myem{f} is close to the table. Can cast a shadow. \begin{enumerate} \item \myem{color} Center. \item \myem{color} Direction orthogonal to the torus plane. \item \myem{numeric} Big ray. \item \myem{numeric} Small ray. \end{enumerate} \end{itemize} \subsubsection{Composed Objects} \begin{itemize} \item draw {\bfseries positivecharge()} Draws a sphere with a plus or minus sign on the surface. The horizontal segment of the sign is drawn on the horizontal plane that contains the sphere center. The middle point of this segment is on a vertical plane containing the viewpoint. \begin{enumerate} \item \myem{boolean} Selects the sign (\myem{true} means positive). \item \myem{color} Position of the center. \item \myem{numeric} Sphere ray. \end{enumerate} \frame{ \begin{figure}[bpt] \begin{center} \includegraphics[width=0.55\columnwidth]{positivecharge.1} \end{center} \caption{Figure that uses \myem{positivecharge}, \myem{getready} and \myem{doitnow}.} \end{figure} } \item draw {\bfseries simplecar()} Draws a cuboid and four discs in a configuration ressembling an automobile. The first three arguments of \myem{simplecar} are the same as the the last seven arguments of \myem{kindofcube} but grouped in colors. \begin{enumerate} \item \myem{color} Center of the cuboid that constitutes the body of the car.. \item \myem{color} Angles defining the orientation of the car (see \myem{kindofcube}). \item \myem{color} Dimensions of the car. \item \myem{color} Characteristics of the front wheels. \myem{redpart}-distance from the front. \myem{greenpart}-width of the front wheels (length of the cylinders). \myem{bluepart}-wheel ray. \item \myem{color} Same as above for the rear wheels \end{enumerate} \frame{ \begin{figure}[bpt] \begin{center} \includegraphics[width=65mm]{simplecar.1} \end{center} \caption{Figure that uses \myem{setthearena} and \myem{simplecar}.} \end{figure} } \item draw {\bfseries banana()} Draws a cylindrical strip with a mark in the middle angle. \begin{enumerate} \item \myem{color} Center of the base circle. \item \myem{numeric} Radius. \item \myem{color} Euler angles for the orientation of the strip (uses \myem{eulerrotation} as if the cylindrical strip axis is the rotation of $\hat{z}$). \item \myem{numeric} Length of the cylindrical strip. \item \myem{numeric} Angular amplitude of half of the cylindrical strip. \end{enumerate} \frame{ \begin{figure}[bpt] \begin{center} \includegraphics[width=65mm]{bananadimmer.1} \end{center} \caption{Figure that uses \myem{banana}.} \end{figure} } \item draw {\bfseries quartertorus()} Draws a part of a torus. \begin{enumerate} \item \myem{color} Center of the base torus. \item \myem{color} Vector indicating the position, relative to the center of the base torus, of the center of the circle obtained by cutting the base torus through a plane containing its axle. \item \myem{color} Vector indicating the orientation of another similar cutting plane (the norm of vector has no meaning). \item \myem{numeric} Radius of cross-section circles. \end{enumerate} \frame{ \begin{figure}[bpt] \begin{center} \includegraphics[width=65mm]{quartertorus.2} \end{center} \caption{Figure that uses \myem{quartertorus}.} \end{figure} } \end{itemize} \subsubsection{Shadow Pathes} Please remember that not all shadows are pathes. \begin{itemize} \item draw {\bfseries signalshadowvertex()} Draws the shadow of a \myem{signalvertex} dot. Used by \myem{emptyline}. \begin{enumerate} \item \myem{color} Location of the light-blocking dot. \item \myem{numeric} Factor of proportionality ("size of the dot"). \item \myem{colour} Colour of the dot. \end{enumerate} \item path {\bfseries ellipticshadowpath()} Produces the shadow of an elliptic path. \begin{enumerate} \item \myem{color} Position of the center. \item \myem{color} Major or minor axis. \item \myem{color} The other axis. \end{enumerate} \item path {\bfseries circleshadowpath()} Produces the shadow of a circle. \begin{enumerate} \item \myem{color} Center of the circle. \item \myem{color} Direction ortogonal to the circle. \item \myem{numeric} Radius of the circle. \end{enumerate} \item path {\bfseries rigorousfearshadowpath()} 3D sphere shadow. \begin{enumerate} \item \myem{color} Center position. \item \myem{numeric} Radius. \end{enumerate} \end{itemize} \subsubsection{Differential Equations} Before we proceed, be aware that solving differential equations (DE) is mainly an experimental activity. The most probable result of a procedure that atempts to solve a DE is garbage. The procedure may be unstable, the solution may be littered with singularities or something may go wrong. If you don't have a basic understanding of differential equations then skip this section, please. \begin{itemize} \item path {\bfseries fieldlinepath()} A vectorial field line is everywhere tangent to the field vectors. Two different parallel fields have the same field lines. So the field only constrains the direction of the field lines, not any kind of "speed" and, therefore, it is recommended to normalize the field before using this macro that contains a second-order Runge-Kutta method implementation. \begin{enumerate} \item \myem{numeric} Total number of steps. \item \myem{color} Initial position. \item \myem{numeric} Step (arc)length. \item \myem{text} Name of the function that returns a field vector for each 3D position. \end{enumerate} \item path {\bfseries trajectorypath()} The acceleration of a particle in a conservative force field is equal to the ratio (conservative force)/(particle mass). The acceleration is also equal to the second order time derivative of the particle position. This produces a second order differential equation that we solve using a second-order Runge-Kutta method implementation. \begin{enumerate} \item \myem{numeric} Total number of steps. \item \myem{color} Initial position. \item \myem{color} Initial velocity. \item \myem{numeric} Time step. \item \myem{text} Name of the function that returns a (force/mass) vector for each 3D position. \end{enumerate} \item path {\bfseries magnetictrajectorypath()} The acceleration of a charged particle in a magnetic field is equal to the ratio (magnetic force)/(particle mass) but the magnetic force depends on both the velocity and the magnetic field. The acceleration is also equal to the second order time derivative of the particle position. This produces a second order differential equation that we solve using a fourth-order Runge-Kutta method implementation. \begin{enumerate} \item \myem{numeric} Total number of steps. \item \myem{color} Initial position. \item \myem{color} Initial velocity. \item \myem{numeric} Time step. \item \myem{text} Name of the function that returns a (charge)*(magnetic field)/(partcle mass) vector for each 3D position. \end{enumerate} \end{itemize} \subsubsection{Renderers} \begin{itemize} \item draw {\bfseries sharpraytrace} Heavy procedure that draws only the visible part of all edges of all defined faces. There's no point in using this procedure when there are no intersections beetween faces. Any how this will not work for non-convex faces nor when \myem{SphericalDistortion:=true}. \item draw {\bfseries lineraytrace()} Draws only the visible part of all defined lines using sequences of dots (\myem{signalvertex} and \myem{PrintStep}). \begin{enumerate} \item \myem{numeric} Dot size. \item \myem{colour} Dot colour. \end{enumerate} \item draw {\bfseries faceraytrace()} Draws only the visible part of all edges of all defined faces using sequences of dots (\myem{signalvertex} and \myem{PrintStep}). \begin{enumerate} \item \myem{numeric} Dot size. \item \myem{colour} Dot colour. \end{enumerate} \item draw {\bfseries draw\_all\_test()} Draws all defined edges (and lines) in a correct way independently of the kind of projection used. Can cast a shadow (but the shadow is not correct when \myem{SphericalDistortion:=true}). \begin{enumerate} \item \myem{boolean} If \myem{true} the lines are also drawn. \end{enumerate} \item draw {\bfseries fill\_faces()} Unfills and draws all faces in the order they were defined (without sorting). Can cast a shadow. \begin{enumerate} \item \myem{text} Like the argument of \myem{drawoptions} but used only inside this macro and only for the edges. \end{enumerate} \item draw {\bfseries draw\_invisible()} This is a fast way of removing hidden lines that doesn't allow for intersecting polygons nor polygons of very different area. It works by +sorting all polygons by distance to \myem{f} and then by "filling" the polygons. This routine may be used to draw graphs of 3D surfaces. \begin{enumerate} \item \myem{boolean} If \myem{true} polygons are sorted relatively to nearest vertex and, if \myem{false}, relatively to their mass center. Choose \myem{false} for surface plots. \item \myem{boolean} If \myem{false} then the polygons are painted with their \myem{FC} colour modified by \myem{LightSource}. If \myem{true} then the next two arguments are used and the polygons are darkened proportionaly to their distance from \myem{f}. \item \myem{colour} Colour of faces. \item \myem{colour} Colour of the edges. \end{enumerate} \item global {\bfseries getready()} When you don't want to edit the source of the \MP\ program, to resort the objects so they'll be drawn correctly, use this macro and the next. \begin{enumerate} \item \myem{string} Command line that would draw some object. For instance: ``\myem{draw rigorousfearpath(black,1);}''. \item \myem{color} Reference position of that object. \end{enumerate} \item draw {\bfseries doitnow} The reference positions given as arguments of previous \myem{getready} calls are used to sort and draw the objects also given as string arguments to previous \myem{getready} calls. Remember to initialize \myem{Nobjects:=0;} before a second figure. \end{itemize} \subsubsection{Nematics (Direction Fields)} Nematics are the least ordered liquid crystals. Their configurations can be described by direction fields (vector fields without arrows). The two following routines ease the task of representing their configurations. \begin{itemize} \item global {\bfseries generatedirline()} Defines a single straight line segment in a given position and with a given orientation. \begin{enumerate} \item \myem{numeric} Line index number. \item \myem{numeric} Angle beetween the \myem{X} axis and the projection of the line on the \myem{XY} plane. \item \myem{numeric} Angle beetween the line and the \myem{XY} plane. \item \myem{numeric} Line (arc)length. \item \myem{color} Position of the line middle point. \end{enumerate} \item draw {\bfseries director\_invisible()} This is a direction field renderer that can sort direction lines. This routine draws straight lines of given "thickness" beetween the first all the points of all the \myem{L[]p[]} lines. It is supposed to help you draw vector fields without arrows but taking care of invisibility. The lines may be generated by \myem{generatedirline} or by other macros. \begin{enumerate} \item \myem{boolean} When there is no need to sort lines you may use \myem{false} here. \item \myem{numeric} "Thickness" of the direction lines \item \myem{boolean} Use \myem{true} for cyclic "direction" lines. \end{enumerate} \end{itemize} \frame{ \begin{figure}[bpt] \begin{center} \includegraphics[width=65mm]{twistflat.1} \end{center} \caption{Figure that uses \myem{director\_invisible} and \myem{generatedirline}.} \end{figure} } \subsubsection{Surface Plots} \FP\ surface plots are geared towards unusual features like equilateral triangular grid, hexagonal domain and merging together functional and parametric surface descriptions. \begin{itemize} \item draw {\bfseries hexagonaltrimesh()} Plots a functional surface on a triangular or hexagonal domain. Uses the \myem{LightSource}. \begin{enumerate} \item \myem{boolean} Select the kind of domain. \myem{true} for hexagonal and \myem{false} for triangular. The domain is centered on the origin (\myem{black}). When the domain is hexagonal two of its corners are on the \myem{-YY} axis. When the domain is triangular one of its corners is on the \myem{X} axis. \item \myem{numeric} Number of small triangles on each side of the triangular domain or three times the number of small triangles on each side of the hexagonal domain. \item \myem{numeric} Length of the triangular domain side or three times the hexagonal domain side. \item \myem{text} Name of the function that returns the \myem{Z} coordinate of a surface point of coordinates \myem{X} and \myem{Y}. \end{enumerate} \frame{ \begin{figure}[bpt] \begin{center} \includegraphics[width=65mm]{hexagonaltrimesh.1} \end{center} \caption{Figure that uses \myem{hexagonaltrimesh}.} \end{figure} } \item global {\bfseries partrimesh()} Defines a parametric surface that can be drawn with \myem{draw\_invisible}. In the following descriptions \myem{S} and \myem{T} are the parameters. Remember to initialize \myem{NF}. The surface is defined so that quadrangles are used whenever possible. If impossible, two triangles are used but their orientation is selected to maximize the surface smoothness. Also note that, unlike \myem{hexagonaltrimesh()}, the spatial range you require to be visible is always first reshaped into a cube and second compressed or extended vertically. How much the cube is compressed or extended depends on the last \myem{numeric} argument, the compression factor for \myem{Z}, meaning that the final height of the cube is 2/(compression factor). Thanks to Sebastian Sturm for pointing the need to explain this. \begin{enumerate} \item \myem{numeric} Number of \myem{T} steps. \item \myem{numeric} Number of \myem{S} steps. \item \myem{numeric} Minimal \myem{T} value. \item \myem{numeric} Maximal \myem{T} value. \item \myem{numeric} Minimal \myem{S} value. \item \myem{numeric} Maximal \myem{S} value. \item \myem{numeric} Minimal \myem{X} value. \item \myem{numeric} Maximal \myem{X} value. \item \myem{numeric} Minimal \myem{Y} value. \item \myem{numeric} Maximal \myem{Y} value. \item \myem{numeric} Minimal \myem{Z} value. \item \myem{numeric} Maximal \myem{Z} value. \item \myem{numeric} Compression factor for \myem{Z} values. \item \myem{text} Name of the function that returns a surface point (of \myem{color} type) for each pair (\myem{S},\myem{T}). \end{enumerate} \end{itemize} \subsubsection{Strictly 2D} \begin{itemize} \item path {\bfseries springpath()} \begin{enumerate} \item \myem{pair} Start point. \item \myem{pair} Finish point. \item \myem{numeric} Number of swings. \item \myem{numeric} Half-width of the swings. \item \myem{numeric} Fraction of the length that is occcupied with swings. \end{enumerate} \item path+draw {\bfseries zigzagfrontier()} \begin{enumerate} \item \myem{pair} Start point. \item \myem{pair} Finish point. \item \myem{numeric} Number of swings. \item \myem{numeric} Standart deviation of the swings' amplitude. \item \myem{numeric} Average swings' amplitude. \item \myem{numeric} Outside thickness. \item \myem{numeric} Inside thickness. \item \myem{colour} Outside color. \item \myem{colour} Inside color. \end{enumerate} \item path {\bfseries randomcirc()} \begin{enumerate} \item \myem{numeric} Average radius. \item \myem{numeric} Standart deviation. \item \myem{numeric} Number of points. \end{enumerate} \item pair {\bfseries radialcross()} Calculates one of both intersections between to circles. \begin{enumerate} \item \myem{pair} Center of the first circle. \item \myem{numeric} Radius of the first circle. \item \myem{pair} Center of the second circle. \item \myem{numeric} Radius of the second circle. \item \myem{boolean} Choice between the upside (\myem{true}) or downside (\myem{false}) intersection (relative to the segment connecting both centers). \end{enumerate} \item draw {\bfseries ropepattern()} Draws a (climbing) rope over a path (see figure \ref{ropes}). \begin{enumerate} \item \myem{path} The path. \item \myem{numeric} Width or thickness of the rope. \item \myem{numeric} Number of windings of each thread. \end{enumerate} \frame{ \begin{figure}[bpt] \begin{center} \includegraphics[width=65mm]{ropepatterns.1} \end{center} \caption{Figure that uses \myem{ropepattern}.} \label{ropes} \end{figure} } \item pair {\bfseries firsttangencypoint()} Returns the first point on a path for which the segment connecting that point and another given reference point is tangent to the path. \begin{enumerate} \item \myem{path} The path. \item \myem{pair} The reference point \item \myem{numeric} Reciprocal of the sampling step along the path in default units. \end{enumerate} \item path {\bfseries lasermachine()} Shrink or swell a cyclic path without cusp points and without coinciding pre and post control points. \begin{enumerate} \item \myem{path} The original path. \item \myem{numeric} Directed distance between the original path and the returned path (positive values are to the right and negative values are to the left of the original path). \item \myem{numeric} Maximum cossine of corner angle above which it remains a sharp corner (only for negative values of directed distance). \end{enumerate} \item path {\bfseries crossingline()} Produces a single path out of two intersecting and cyclic paths. The paths must be adapted with \myem{startahead} and/or \myem{reverse} so that they both rotate in the same direction and they start on consecutive "lobes". Now pay attention: given the direction of rotation (clockwise or counter-clockwise) the SecondPath must start BEFORE the FirstPath. And another problem: there must be at least four intersection points. \begin{enumerate} \item \myem{path} FirstPath. \item \myem{path} SecondPath. \item \myem{numeric} Time resolution. \end{enumerate} \end{itemize} \section{Missing documentation} \begin{alltt} minimizestep( expr Abcisscolor )( text PlainFunc ) improvertex( expr VerA, DisA, VerB, DisB, VerC, DisC, IniV ) ultraimprovertex( expr PlanPoi, PlanDir, BaseCenter, Radius, LenVec, CentrPoi, NorthPoleVec, Ray, IniV ) necplusimprovertex( expr PlanPoi, PlanDir, CentrPoiA, NorthPoleVecA, RayA, CentrPoiB, NorthPoleVecB, RayB, IniV ) intersectprolatespheroid( expr CentrPoi, NorthPoleVec, Ray, LinePoi, LineDir, IniV ) intersectorus( expr Tcenter, Tmoment, Bray, Sray, LinePoi, LineDir ) ellipsoid( expr Centr, AxOne, AxTwo, AxThr ) revolparab( expr BaseCenter, ParabTip, BaseRay ) pointinsidetorus( expr Point, Tcenter, Tmoment, Bray, Sray ) \end{alltt} \mode
{\newpage} \section{Reference-at-a-glance} \subsection{Sphere} \frame{ \frametitle{\myem{tropicalglobe}( $N$, $\vec{c}$, $R$, $\vec{A}$ )} \begin{center} \includegraphics[width=65mm]{revolvers.1} \\ \myem{tropicalglobe( 5, black, 1, blue );} \end{center} } \subsection{Disc} \frame{ \frametitle{\myem{rigorousdisc}( $R_i$, \myem{bool}, $\vec{c}$, $R_o$, $\vec{A}$ )} \begin{center} \includegraphics[width=65mm]{revolvers.2} \\ \myem{rigorousdisc( 0.5, true, black, 1, 0.85blue );} \end{center} } \subsection{Torus} \frame{ \frametitle{\myem{smoothtorus}( $\vec{c}$, $\vec{A}$, $R_b$, $R_s$ )} \begin{center} \includegraphics[width=65mm]{revolvers.3} \\ \myem{smoothtorus( black, blue, 0.7, 0.4 );} \end{center} } \subsection{Bowl} \frame{ \frametitle{\myem{spatialhalfsfear}( $\vec{c}$, $\vec{A}$, $R$ )} \begin{center} \includegraphics[width=65mm]{revolvers.4} \\ \myem{spatialhalfsfear( black, blue, 1 );} \end{center} } \subsection{Cuboid} \frame{ \frametitle{\myem{kindofcube}(\myem{bool,bool},$\vec{o},\alpha_1,\alpha_2,\alpha_3,l_1,l_2,l_3$)} \begin{center} \includegraphics[width=65mm]{kindofcuber.1} \\ \myem{kindofcube( false, true, black, 130, 32, 67, 0.3, 0.6, 0.9 );} \end{center} } \subsection{Simple car} \frame{ \frametitle{\myem{simplecar}( $\vec{o}$,($\alpha_1,\alpha_2,\alpha_3$), ($l_1,l_2,l_3$), (Xf,Yf,Zf), (Xr,Yr,Zr) )} \begin{center} \includegraphics[width=65mm]{simplecarparam.1} \\ \myem{simplecar( black, black, (0.8,0.35,0.18), (0.1,0.2,0.132), (0.06,0.06,0.1) );} \end{center} } \subsection{Cone} \frame{ \frametitle{\myem{verygoodcone}( \myem{bool}, $\vec{c}$, $\vec{A}$, $R$, $\vec{v}$ )} \begin{center} \includegraphics[width=65mm]{cone.1} \\ \myem{verygoodcone( true, black, blue, 0.8, blue+green );} \end{center} } \subsection{Elliptic prism} \frame{ \frametitle{\myem{whatisthis}( $\vec{c}$, $\vec{S}_1$, $\vec{B}_1$, $D$, $||\vec{S}_2||/||\vec{S}_1||$ )} \begin{center} \includegraphics[width=65mm]{ellipticprism.1} \\ \myem{whatisthis( black, 0.5red, green, 0.85, 0.8 );} \end{center} } \subsection{Spheroid} \frame{ \frametitle{\myem{spheroid}( $\vec{c}$, $\vec{S}$, $R$ )} \begin{center} \includegraphics[width=40mm]{revolvers.5} \\ \myem{spheroid( black, 2*blue, 1 );} \end{center} } \subsection{Cylindrical strip} \frame{ \frametitle{\myem{banana}( $\vec{c}$, $R$, $(\alpha_M,\beta_M,\gamma_M)$, $L$, $\theta$ )} \begin{center} \includegraphics[width=70mm]{revolvers.6} \\ \myem{banana( black, 1, black, 0.3, 145 );} \end{center} } \subsection{Torus' slice} \frame{ \frametitle{\myem{quartertorus}( $\vec{c}$, $\vec{A}$, $\vec{B}$, $R$ )} \begin{center} \includegraphics[width=70mm]{revolvers.7} \\ \myem{quartertorus( black, -red, red-green, 0.25 );} \end{center} } \section{References} \begin{description} \item[1.] ``The \MF book'' by Don Knuth \item[2.] ``\MP, a user’s manual'' by John Hobby and the MetaPost development team \item[3.] ``The NURBSbook'' by Les Piegl and Wayne Tiller \end{description} \section{Acknowledgements} \frame{ \changeableframetitle{Acknowledgements} Many people have contributed to make \FP\ what it is today. Perhaps it would have never come into being without the early intervention of Jorge B\'arrios, providing access to his father's computer in 1986. Another important moment happened when Jos\'e Esteves first spoke about \MP\ sometime in the late nineties. Also, the very accurate criticism of Cristian Barbarosie has significantly contributed to fundamental improvements. Jens Schwai\-ger contributed new macros. Pedro Sebas\-ti\~ao, Jo\~ao Dinis and Gon\-\c{c}alo Mo\-rais proposed challenging new features. } \end{document}