text:
What Is LiveGraphics3D?
LiveGraphics3D is a non-commercial Java 1.1 applet to display and rotate three-dimensional graphics produced by Mathematica in HTML pages. It may be used without charge for any non-commercial purposes. Mathematica is a program for symbolic and numeric mathematics by Wolfram Research, Inc.. As a part of webMathematica, LiveGraphics3D may be licensed for commercial purposes by Wolfram Research, Inc..
LiveGraphics3D enables all Mathematica users to put almost any three-dimensional graphics computed by Mathematica directly onto a HTML page, such that everyone with a web browser supporting Java 1.1 can view and interactively rotate the graphics without any additional software.
Additionally LiveGraphics3D is able to show animations, calculate stereo graphics, integrate hyperlinks, render basic mathematical notations, and display bitmap backgrounds.
Since version 1.00 LiveGraphics3D supports parametrized graphics, i.e. simple Mathematica expressions instead of coordinates, and animations with Animate. An introduction to these features is given in some examples and my talk at the Mathematica Developer Conference.
What to Read Next?In order to learn how to rotate, zoom, strip, and animate graphics displayed by LiveGraphics3D you should read the User Interface section. (A subsection about Trouble Shooting is included.)
If you want to use LiveGraphics3D in your own HTML pages, you do not have to know anything about Java programming, as all needed classes are already compiled. However, you have to install the Java archive live.jar on your local computer as described in the Installation section.
The section Preparing Graphics with Mathematica gives additional information and tips about producing and converting three-dimensional graphics with Mathematica.
If you have any comments, critisism, bug reports, or ideas regarding this software or its documentation please e-mail me.
Quick Start
In order to view LiveGraphics3D applets you will usually use a web browser supporting Java 1.1 and activate Java in the options or preferences menu (if not already activated). (An alternative is to call the applet directly from within Mathematica via J/Link, see below).
After a LiveGraphics3D applet has successfully initialized itself the following interactions are always supported.
|user action
|applet reaction
|dragging (left mouse button pressed)
|rotating about an axis in the picture
|releasing left mouse button while dragging
|spinning about an axis in the picture
|SHIFT key pressed plus vertical dragging
|SHIFT key pressed plus horizontal dragging
|rotating about an axis perpendicular to the picture
|CONTROL key pressed plus vertical dragging
|changing focal length
|CONTROL key pressed plus horizontal dragging
|changing strength of stereo effect
|META (ALT) key (or right mouse button) pressed plus vertical dragging
|stripping parts of the graphics
|"o" key
|printing parameter settings to the Java console (aka Java messages window)
|"s" key
|toggling between single picture, stereo pictures for diverge fusing and stereo pictures for cross fusing
|HOME key
|restoring original perspective (no spinning)
The META key is usually mapped to the ALTERNATE (ALT) or COMMAND key; on some systems it is emulated by the right mouse button. The CONTROL key (CTRL) does not work with all web browsers (e.g. Safari). You might be able to use CONTROL plus right(!) mouse button instead. Rotation about an axis perpendicular to the picture is not possible if a rotating background is included.
Several additional interactions are supported for animations.
|user action
|applet reaction
|entering applet region
|starting animation
|leaving applet region
|stopping animation
|double clicking
|stopping or restarting animation
|META (ALT) key (or right mouse button) pressed plus horizontal dragging
|switching through frames
Trouble Shooting
This subsection is about problems possibly appearing when a web page containing a LiveGraphics3D applet is viewed. (Problems with the integration of the LiveGraphics3D applet in your own web pages are discussed in the Trouble Shooting subsection of the Installation section.)
Many problems with LiveGraphics3D (and Java applets in general) can be solved by reloading the applet. In order to do so you usually have to hold down SHIFT or CONTROL (depending on your web browser) when clicking the reload button (otherwise only the HTML code but not the Java code of the applet is reloaded).
|no applet visible (not even a gray box)
|Please use a web browser supporting Java and activate Java in the preferences/options menu.
|security error message about Java applet
|Either lower your Java security settings (see instructions here) or ask the author of the web page to install the signed version of LiveGraphics3D.
|only a gray box visible (together with a Java error message by the browser)
If the error message is something about not finding "Live.class",
then you should update your web browser, as Java 1.1 has to be supported.
Otherwise you should reload the web page.
|only initialization picture visible (together with a Java error message by the browser)
|Reload the web page.
|LiveGraphics3D error message
|Make sure to use Java 1.1 (see above). Then deactivate any proxy, restart your web browser and reload the page. If the problem remains, contact the owner of the page.
|special characters not displayed
|Unfortunately some web browser still don't support special characters in Java applets. (Additionally, the requested fonts might not be available on your system. You might want to ask the owner of the web page, which fonts are required.)
|remaining problems
|Try pressing SHIFT or CONTROL when clicking the reload button and do not interact with the browser while loading the page; empty all caches, deactivate any proxy, and restart your web browser; try different web browsers, operating systems, or machines; ask other people to try the URL on their machine.
Please report any unsolvable problems with LiveGraphics3D.
This subsection presents some details of the user interface. First the determination of the axis of rotation is described and then a way to find suitable values for some parameters is discussed.
The axis of rotation is usually in the plane of the two-dimensional picture and perpendicular to the virtual line you moved with the mouse (starting from the point on which you clicked). The angle of rotation is determined by the length of that line. This allows you to view the graphics from all directions. However, the presence of rotating bitmap backgrounds changes this prescription. In this case, horizontal dragging will rotate about the fixed vertical axis and vertical dragging about the horizontal axis in the plane of the picture
Pressing SHIFT and dragging vertically will change the value of the parameter MAGNIFICATION. Pressing CONTROL and dragging horizontally will change the parameter STEREO_DISTANCE. (Negative values indicate the need to cross fuse while positive values are appropriate for diverge fusing.) The current settings of MAGNIFICATION, STEREO_DISTANCE and the Graphics3D options ViewPoint and ViewVertical can be printed to the Java console by pressing the "o" key while the mouse cursor is in the region of the Java applet. (Web browsers supporting Java should be able to display the Java console; however, many recent web browsers lack this feature. If your web browser doesn't offer a Java console, you can display it with the help of J/Link which is part of Mathematica, see below). If you are using LiveGraphics3D on your own HTML page, you can copy the line containing MAGNIFICATION or STEREO_DISTANCE from the Java console into the applet call and/or the settings of ViewPoint and ViewVertical into the Graphics3D definition to use them as initial values. This is probably the best way to find appropriate values for these parameters.
There is no need to install anything in order to view and rotate graphics on other pages using LiveGraphics3D, as your web browser automatically loads and executes the needed Java archive if necessary.
However, in order to use LiveGraphics3D in one of your own web pages you need the Java archive live.jar in the directory of your HTML file. This is like the way pictures are included in web pages: HTML pages contain instructions to load encoded image files and web browsers read, decode and display them. The only difference with a Java archive is that Java code is not displayed but executed!
Quick Start
You should be able to download the Java archive live.jar with your web browser and save it on your local computer. (Usually you will have to press CONTROL when clicking on the link above or click with the right mouse button and save the file as "binary" or "source".)
Note that LiveGraphics3D is free for non-commercial purposes only. As a part of webMathematica it may be licensed for commercial purposes by Wolfram Research, Inc..
After copying live.jar you may start to create HTML pages including LiveGraphics3D applets. The corresponding HTML files should be placed in the same directory as the live.jar file. A complete example follows.
First a file containing the Graphics3D object is needed. Let's call it test.m with the following contents:
Graphics3D[{ (* ...primitives and directives... *) }, BoxRatios->{1,4,9} (* ...options... *)]Then we need an HTML page. Here is a simple example:
<HTML> <APPLET ARCHIVE="live.jar" CODE="Live.class" WIDTH=150 HEIGHT=150 ALIGN=LEFT> <PARAM NAME="BGCOLOR" VALUE=#FFFFFF> <PARAM NAME="MAGNIFICATION" VALUE=1.> <PARAM NAME="INPUT_FILE" VALUE="test.m"> </APPLET> </HTML>
Please note that file names are case sensitive, that all files need appropriate read permissions, and that some firewalls might not allow access to local ".m" files.
If placed in the directory of the Java archive live.jar together with the file test.m on your computer this HTML page should produce the following LiveGraphics3D applet:
If this example works, you might whish to skip the next subsection and jump to the subsection Attributes and Parameters which discusses the attributes and parameters of the LiveGraphics3D APPLET tag or to the section Preparing Graphics with Mathematica for information about converting Graphics3D (and other graphical) objects to an InputForm appropriate for LiveGraphics3D.
Trouble Shooting
If the Java archive does not work as described, it was probably corrupted during the transmission. In this case please empty all caches, disable any proxy, restart your web browser and download the Java archive live.jar again and restart your web browser once again, as it might use the corrupted archive otherwise. If this does not solve the problem, you might try to use another web browser or even switch to another operating system if possible. You can also e-mail me and I'll send you the file as an attachment.
Attributes and Parameters
The LiveGraphics3D applet can be controlled by setting several attributes and parameters, as demonstrated in the Quick Start subsection. Most of the attributes and parameters are optional, however the attributes ARCHIVE, CODE, WIDTH, and HEIGHT and the parameter INPUT_FILE has to be specified. (The parameter INPUT may be used instead of INPUT_FILE.)
The applet's attributes primarily control how the applet appears within the HTML page. (See the HMTL 4.0 or HTML 3.2 Reference Specification for the official list of attributes.)
|alternate text for text-only display
|where to place the applet within the page: LEFT, RIGHT, TOP, TEXTTOP, MIDDLE, ABSMIDDLE, BASELINE, BOTTOM, ABSBOTTOM .
|name of the Java archive, must be "live.jar" for LiveGraphics3D
|name of the class file, must be "Live.class" for LiveGraphics3D
|directory name or URL, specifying where to find the live.jar file
|height of the applet's box in pixels
|space to leave around the applet horizontally
|name of the applet (not used in LiveGraphics3D)
|space to leave around the applet vertically
|width of the applet's box in pixels
Apart from these attributes the LiveGraphics3D applet offers additional parameters controling the applet itself. These parameters have to be set with PARAM tags as shown in the Quick Start subsection. (I recommend using upper case letters for the names of these parameters.)
|file name of an audio file (".au" format); played whenever the mouse enters the applet
|same as AUDIO_ENTER but played in a loop
|same as AUDIO_ENTER but played whenever the first frame of an animation is displayed
|file name of a JPEG or GIF image to be displayed as fixed background
|background color in hexadecimal form
|file name of a JPEG or GIF image to be displayed as a cylindrical background
|a list of replacement rules for dependent variables of the form {variable->expression, ...}.
|a list of replacement rules for initialization values of independent variables of the form {variable->number, ...}.
|one angle in degrees (or two angles separated by a comma), specifying an initial rotation or a label for the angle(s) which has to be defined in the reference part of the URL
|string (enclosed in double-quotes) containing an InputForm of a Graphics3D or ShowAnimation object (double-quotes (") within this string should be replaced by pairs of single quotes (''))
|name of a zip archive (created for example with the zip program, see Info-ZIP) containing the INPUT_FILE. (INPUT_FILE has to be set to the name of the file inside the zip archive.)
|name of a file containing an InputForm of a Graphics3D or ShowAnimation object. (This file may be inside a zip archive, see INPUT_ARCHIVE.)
|zoom factor (interactively modified by pressing SHIFT and dragging vertically) (see above)
|applet reaction initiated by dragging the mouse. (Default is rotating, use NONE in order to disable rotating, which is useful for 2D graphics.)
|color for edges of all points in hexadecimal form
|file name of a JPEG or GIF image to be displayed while other files are loaded and parsed
|file name of a second background image for the right eye (should have the same size)
|file name of a JPEG or GIF image to be displayed as a spherical background
|default spinning velocity about a vertical axis, specified by the corresponding mouse movement in pixels per frame. The frame rate is either 0.05 sec or defined by the AnimationDisplayTime option in an animation.
|same as SPIN_X for a default spinning velocity about a horizontal axis.
|distance between the two stereo view points in units of the length of the diagonal of the bounding box (positive values for diverge fusing, negative values for cross fusing; see above)
|number of stripped primitives; the last primitive in the flattened list of primitives is stripped (removed) first
|determines which faces of polygons to draw. (Default is to draw both; the value FRONT will draw only front faces, the value BACK only back faces.)
By default background images will always be "centered". (ViewPoint will only change the appearance of the Graphics3D object and does not affect the background image; however in the cases of CYLINDRICAL_BACKGROUND and SPHERICAL_BACKGROUND the background can be rotated initially with INITIAL_ROTATION.) There are some restrictions on rotatable images, which are explained on the page of the birds example.If the value of the parameter INITIAL_ROTATION is a label instead of a number, the applet will look in the reference part of the URL (the part following a "#") for a definition of the form "label=number" or "label=number,number". In any case the first number is interpreted as a rotation angle in degrees about a vertical axis, the optional second number defines a rotation about a horizontal axis. Unfortunately, this feature is not supported by many web browsers.
In order to display stereo graphics instead of a single picture define STEREO_DISTANCE with an appropriate value (for example with the default value of 0.05).
The production of InputForms of Graphics3D objects within Mathematica is explained below.
Interfacing with J/Link (documentation updated for version 1.90)
With the help of J/Link, which is a part of Mathematica, you can call LiveGraphics from within Mathematica. The latest version of J/Link (currently 3.0.0) can be downloaded here. Calling an applet is discussed in the Mathematica documentation under Add-ons&Links : J/Link : Part1 : Advanced Topics: ... Hosting Applets. Here I summarize the main points and present some solutions for specific problems with LiveGraphics3D. The reader is assumed to have a basic knowledge of Mathematica and the possibility to execute Mathematica commands including J/Link.
First you have to download the live.jar to a directory on your computer, let's call it dir.
Then you can start Mathematica and from within Mathematica start J/Link and tell J/Link about the directory dir where it can find the file live.jar. (For other ways to tell J/Link about new Java code, see the J/Link documentation.)
<< JLink` InstallJava[]; AddToClassPath[dir];
Here dir has to be replaced by a string specifying the directory of the file live.jar. We need a small function to produce appropriate strings describing three-dimensional Mathematica graphics. The function LiveForm (discussed below) almost performs this task; we only have to convert the returned value to a string and then replace double quotes by pairs of single quotes because they would otherwise cause problems. Here is the definition of LiveForm:
LiveForm[graphics_, animOpts___] := Module[{graphics3d = Switch[graphics, _ContourGraphics, Graphics3D[SurfaceGraphics[graphics]], _DensityGraphics, Graphics3D[SurfaceGraphics[graphics]], _SurfaceGraphics, Graphics3D[graphics], _, graphics]//.SequenceForm[x___]:> StringForm[StringJoin[Table["``", {Length[{x}]}]], x]}, Switch[graphics3d, _List, HoldForm[ShowAnimation][ Map[LiveForm, graphics3d], InputForm[N[Flatten[{animOpts}]]]], _, InputForm[N[graphics3d]]]];
Now let's make some graphics and call LiveGraphics3D with it:
g = Graphics3D[Plot3D[Re[Exp[x + I y]], {x, -2, 2}, {y, -10, 10}, PlotRange->All, PlotLabel->SequenceForm["Re", StyleForm["(", FontSize->24], Superscript["e", SequenceForm["x + ", "i y"]], StyleForm[")", FontSize->24]], AxesLabel->{"x", "y", None}, TextStyle->{FontSize->18, FontFamily->"Times"}]];
We can call the Live.class of LiveGraphics3D with the J/Link function AppletViewer:
AppletViewer["Live", {"INPUT="<> StringReplace[ToString[LiveForm[g]],"\""->"''"], "WIDTH=400", "HEIGHT=400"}]
This will open a new window showing the applet. You can get some information from the applet by opening the Java console with
and then pressing the "o" key in the applet viewer. LiveGraphics3D will print most of the current option values to the Java console.
For more interaction with the LiveGraphics3D applet, we need an instance of the Java object. This is achieved this way:
applet = JavaNew["Live"]; AppletViewer[applet, {"INPUT="<> StringReplace[ToString[LiveForm[g]],"\""->"''"], "WIDTH=400", "HEIGHT=400"}]
Now we can call public methods of the applet, e.g.
When an applet instance is no longer needed, we can release it with:
There is in fact a set of public methods available for controlling the applet. All methods return a boolean, i.e. either True or False indicating whether they were successful or not. Some of the methods are related to parameters of the applet or mouse actions as listed in the table. Another table summarizes the functions for querying the current values. The syntax of the call within Mathematica is always as in the example above: applet-variable@method-name[values-for-arguments].
|parameter/mouse action
|boolean rotateToViewPointAndViewVertical(double vpx, vpy, vpz, vvx, vvy, vvz)
|rotates to the view point (keeps initial view point)
|simple dragging
|boolean setFrame(int new_frame_index)
|sets the frame index for animations
|ALT + dragging horizontally
|boolean setGraphics3D(String input_text)
|sets a new Graphics3D object
|boolean setGraphics3D(String input_text, String independent_vars, String dependent_vars)
|sets a new parameterized Graphics3D object
|boolean setInputFile(String input_file, String input_archive)
|sets a new input file (use null for input_archive if uncompressed)
|boolean setMagnification(double new_magnification)
|sets the magnification factor
|MAGNIFICATION, SHIFT + dragging vertically
|boolean setPlotRange(double x_min, double x_max, double y_min, double y_max, double z_min, double z_max)
|sets the plot range
|PlotRange option
|boolean setSpin(double new_spin_x, double new_spin_y)
|sets the spin velocity
|boolean setStereoDistance(double new_stereo_distance)
|sets the stereo distance (0: no stereo)
|STEREO_DISTANCE, CTRL + dragging horizontally
|boolean setStrippedPrimitives(int new_stripped_primitives_count)
|sets the number of stripped primitives
|STRIPPED_PRIMITIVES, ALT + dragging vertically
|boolean setVariable(String name, double value)
|sets an independent variable
|dragging points
|boolean setViewPointAndViewVertical(double vpx, vpy, vpz, vvx, vvy, vvz)
|sets the view point (current and initial)
|ViewPoint and ViewVertical option
|boolean startAnimation(), boolean stopAnimation()
|starts/stops an animation
|double clicking
|int getFrame()
|gets the frame index of animations
|double getMagnification()
|gets the magnification factor
|double getPlotRangeXMin(), double getPlotRangeXMax(), double getPlotRangeYMin(), ...
|gets the plot range
|double getSpinX(), double getSpinY()
|gets the spin velocity
|double getStereoDistance()
|gets the stereo distance
|int getStrippedPrimitives()
|gets the number of stripped primitives
|double getVariable(String name)
|gets the value of any variable
|double getVersionNumber()
|gets the version number of the applet
|double getViewPointX(), double getViewPointY(), ...
|gets the view point
|double getViewVerticalX(), double getViewVerticalY(), ...
|gets the view vertical
|boolean isAnimationPlaying()
|determines whether an animation is being played
Parametrized graphics are a special kind of graphics which include variables. They are discussed in detail below. Here I will only give a small example to show how parametrized graphics are called with J/Link. The (very simple) example is constructed within Mathematica this way:
independentVariables = {x->3, y->2, z->1}; dependentVariables = {mx->x/2, my->y/2, mz->z/2}; g = Graphics3D[{Line[{{0, 0, 0}, {x, y, z}}], PointSize[0.05], Point[{mx, my, mz}], PointSize[0.1], Point[{x, y, z}], Text[SequenceForm["x=", x], {x, y, z}, {0, 3}]}, TextStyle->{FontSize->24}]; Show[g //. Join[independentVariables, dependentVariables]];
After starting J/Link, adding the directory of the file live.jar with AddToClassPath and defining the function LiveForm as above, we create and display a Java object with:
applet = JavaNew["Live"]; AppletViewer[applet, {"INPUT="<> StringReplace[ToString[LiveForm[g]],"\""->"''"], "INDEPENDENT_VARIABLES="<> ToString[InputForm[N[independentVariables]]], "DEPENDENT_VARIABLES="<> ToString[InputForm[N[dependentVariables]]], "WIDTH=400", "HEIGHT=400"}];
It is now possible to drag the larger point by clicking it with the left mouse button and moving the mouse while holding the mouse button pressed. Current values of variables can be obtained with the help of the Java console and the "o" key or with the help of the public Java function getVariable:
Independent variables can also be set to new values with the help of the function setVariable. As always, the applet should be released when you no longer need it:
This section is about using Mathematica to prepare and convert graphics produced with the help of Mathematica. Therefore, the reader is assumed to have a basic knowledge of Mathematica and the possibility to execute Mathematica commands.
Producing Graphics with Mathematica
There are some built-in commands to produce three-dimensional graphics with Mathematica: Plot3D, ParametricPlot3D and ListPlot3D. Three-dimensional graphics may also be built by combining graphics primitives like Point, Line, Polygon etc. in a Graphics3D object. There are also several standard packages like Graphics`ContourPlot3D`, Graphics`Graphics3D`, Graphics`PlotField3D`, Graphics`Polyhedra`, Graphics`Shapes` or Graphics`SurfaceOfRevolution` with more commands and three-dimensional objects.
Anyway, in many cases a Graphics3D object is produced, which has to be converted into an appropriate InputForm in order to be displayed by LiveGraphics3D. This convertion is explained in the subsection Converting Graphics3D Objects, while the subsection Converting Animations describes the combination of several Graphics3D objects in an animation. Finally the subsection Converting Other Graphical Objects discusses how to convert other types of graphical objects of Mathematica into Graphics3D objects. (This covers ContourGraphics, DensityGraphics and SurfaceGraphics.)
In some cases a preprocessing of the Mathematica graphics is appropriate, e.g. when there are intersections of polygons. Together with Eric W. Weisstein I have written a Mathematica package LiveGraphics3D.m which attacks these problems. Eric has also written a small demo for it: LiveGraphics3DDemo.nb.
In general LiveGraphics3D will only be used to display graphics computed by Mathematica. However, the Graphics3D definition for a LiveGraphics3D applet can also be modified (or even created) manually. Additionally LiveGraphics might also be used to find good values for the Graphics3D options ViewPoint and ViewVertical (see above).
Converting Graphics3D Objects
In order to display any Graphics3D, ContourGraphics, DensityGraphics, or SurfaceGraphics object with LiveGraphics3D, it has to be converted into an appropriate InputForm. This is can be done with the function LiveForm as defined below. The function also converts lists of Graphics3D objects to animations and replaces all SequenceForms into StringForms to avoid problems with the formatting of SequenceForm.
LiveForm[graphics_, animOpts___] := Module[{graphics3d = Switch[graphics, _ContourGraphics, Graphics3D[SurfaceGraphics[graphics]], _DensityGraphics, Graphics3D[SurfaceGraphics[graphics]], _SurfaceGraphics, Graphics3D[graphics], _, graphics]//.SequenceForm[x___]:> StringForm[StringJoin[Table["``", {Length[{x}]}]], x]}, Switch[graphics3d, _List, HoldForm[ShowAnimation][ Map[LiveForm, graphics3d], InputForm[N[Flatten[{animOpts}]]]], _, InputForm[N[graphics3d]]]];
New for version 1.90: The function was slightly updated, in particular to avoid problems with SequenceForms.
If g is a Graphics3D object (for example returned by ParametricPlot3D) then the InputForm is generated by LiveForm[g]. The result can be pasted into a file, whose name is used as the value of the LiveGraphics3D parameter INPUT_FILE (see the example above).
The value of INPUT_FILE is expected to be the name of a file containing an InputForm of a LiveGraphics3D object. Certainly we can write such a file within Mathematica. Here is a function to do so:
WriteLiveForm[filename_, graphics_, animOpts___] := Module[{ps,x}, ps=Unprotect[Real]; Format[x_Real, InputForm] := OutputForm[NumberForm[x, 5, NumberFormat -> (If[#3 == "", #1, SequenceForm[#1, "*^", #3]] &)]]; Protect@@ps; WriteString[filename, ToString[LiveForm[graphics, animOpts], CharacterEncoding->None]]; Close[filename]; ps=Unprotect[Real]; Format[x_Real, InputForm] =.; Protect@@ps;];
If g is again a Graphics3D object then WriteLiveForm["test.m", g] will write an appropriate InputForm of g into a file called test.m in the current directory. (The Mathematica function Directory[] will display the name of the current directory, FileNames[] will list the names of the files in it and SetDirectory["directoy name"] will change it.)
If LiveGraphics3D does not accept an input it will display an error message including the critical part of the InputForm. However all correct Graphics3D objects accepted by Mathematica and converted as described above should work without difficulties.
However, in some cases LiveGraphics3D will not display the graphics in exactly the same way as Mathematica does. All differences and limitations are listed in the appendix Limitations.
Converting Animations
There are two different kinds of animations in LiveGraphics3D. (Simple spinning does not count as an animation here!) One is to animate a list of Graphics3D objects similarly to the Mathematica command ShowAnimation. The syntax to specify this list is ShowAnimation[gl, opts] with gl being a list of Graphics3D objects and opts a list (or sequence) of Graphics3D options or Mathematica's Cell options AnimationDirection and AnimationDisplayTime. (Lists of Graphics3D objects can be easily produced with the Table command of Mathematica.) AnimationDirection may be Forward, Backward, or ForwardBackward; AnimationDisplayTime specifies the minimum time each frame is displayed in seconds.
The function LiveForm[gl, opts] from above will produce the needed form; the function WriteLiveForm[filename, gl, opts] from above will write it to a file.
Since version 1.00 there is another way to specify an animation, which is the animation of a Graphics3D object that is parametrized by a time parameter. This is similar to the Animate command in Mathematica. Details about parametrized graphics are discussed below. The syntax of the Animate command in LiveGraphics3D is Animate[g, {var, from, to, step}, opts] where g is a parametrized Graphics3D object, var is the time variable, from is its starting value, to the maximum value, step the size of the time steps, and opts a list or sequence of animation options as discussed above. Note that the time parameter var has to be declared in the applet parameter INDEPENDENT_VARIABLES, although the initial value is specified by from. (See below for an explanation of INDEPENDENT_VARIABLES.)
The following definition (in addition to the previous definition for LiveForm) will produce an appropriate form when called with LiveForm[g, {var, from, to, step}, opts]. (Correspondingly, WriteLiveForm will use this function to write the expression to a file.)
LiveForm[graphics_, {var_, from_, to_, step_}, animOpts___] := Module[{},HoldForm[Animate][LiveForm[graphics], InputForm[N[{var,from,to,step}]],InputForm[N[Flatten[{animOpts}]]]]];
Converting Two-Dimensional Graphics
Simple two-dimensional graphics (Graphics objects) can be converted to three-dimensional graphics with the Mathematica command StackGraphics of the Graphics`Graphics3D` package and an appropriate setting of the ViewPoint option. However, in order to avoid any complications, even two-dimensional graphics should be constructed in three-dimensions with all z-coordinates being 0. In order to avoid rotations of two-dimensional graphics the applet parameter MOUSE_DRAG_ACTION should be set to NONE.
Converting Other Graphical Objects
ContourGraphics, DensityGraphics, and SurfaceGraphics have to be converted to Graphics3D objects before they can be used with LiveGraphics3D. This is done automatically by the functions LiveForm and WriteLiveForm defined above.
The following table includes several standard Mathematica functions, the type of their returned graphics and the command to convert an object called g of this type into a Graphics3D object. (ParametricPlot3D returns Graphics3D objects, thus it is not listed here.)
|return type
|command to convert object g
Parametrized Graphics (new in version 1.00)
Parametrized graphics are Graphics3D objects which contain mathematical expressions with undefined variables, e.g. Graphics3D[{Point[{x, y, 0.5*x}]}]. The display and interactive manipulation of such graphics is supported by LiveGraphics3D since version 1.00. The basic benefit of parametrized graphics is the possibility to interact with them by dragging points, i.e. when a user drags certain points, LiveGraphics3D will update the whole scene accordingly. An introduction to parametrized graphics with LiveGraphics3D is given in my talk Direct Manipulation of Parametrized Graphics, which was presented at the Mathematica Developer Conference 2001. There are also several documented examples of parametrized graphics available. The rest of this section covers (in this order) the initialization and definition of variables and details about the evaluation and specification of expressions in LiveGraphics3D.
As mentioned, parametrized graphics may contain expressions with variables, e.g. the x and y in our example Graphics3D[{Point[{x, y, 0.5*x}]}]. All variables have to be initialized or defined with the help of the applet parameters INDEPENDENT_VARIABLES and DEPENDENT_VARIABLES. (These declarations are required because the initial display of the graphics requires values for all variables in order to evaluate all expressions.)
The difference between independent and dependent variables is that independent variables may be manipulated by the user, while each dependent variable has a defined dependency on other variables, which is always enforced; thus the user may not manipulate dependent variables directly. The manipulation of independent variables is possible by dragging Point primitives with at least one coordinate that is specified directly by an independent variable. When the user drags such points, the corresponding independent variable changes its value according to the new position.
The applet parameter INDEPENDENT_VARIABLES has to be set to a list of rules of the form {identifier->number, ...}, e.g. {x->0, hello->3.1415}. This lists defines initial values for all independent variables. DEPENDENT_VARIABLES defines the dependent variables and their dependencies. Its value has to be a list of rules of the form {identifier->expression, ...}, e.g. {y->2*x, siny->Sin[y], aConstant->5, x->If[x<0,0,x]}. The expressions are simple Mathematica expressions as described below. Note that any dependent variable may depend on any independent variable, e.g. in this example the dependent variable y depends on the independent variable x. A dependent variable may also depend on preceding dependent variables, e.g. the second dependent variable siny depends on the first dependent variable y. A dependent variable may also be set to a constant value, e.g. aConstant->5. As dependent variables may not be manipulated by the user, such variables are in fact constants.
Advanced usage of DEPENDENT_VARIABLES: The rules in DEPENDENT_VARIABLES are actually used to assign new values to all dependent variables after any of the independent variables has been manipulated by the user. These assignments are performed sequentially by evaluating the expression of the right-hand side of each rule and setting the variable on the left-hand side to the result. In some cases it is convenient to use these assignments also for independent variables, e.g. in our example the rule x->If[x<0,0,x] sets x to 0 whenever the user tries to "drag" it to a negative value. (Note that x occurs also in INDEPENDENT_VARIABLES.) There may be any number of rules for an independent variable in the list of DEPENDENT_VARIABLES; however, there may only be one rule for each dependent variable. (It is just convenient to have multiple rules for an independent variable, while there is no reason to permit this for dependent variables.)
Parametrized graphics may contain simple Mathematica expressions instead of coordinates within some primitives and on the right-hand side of the rules in the DEPENDENT_VARIABLES, but nowhere else. In particular, you may use an expression instead of any coordinate in a Point, Polygon, or Line primtive. You may also use expressions in the second argument of the Text primitive. However, you may not put an expression around the mentioned primitives, or within the Cuboid primitive or in any directive, e.g. RGBColor, or option, e.g. ViewPoint.
Special expressions (new in version 1.80): The first argument of the Text primitive may not be an expression; however, you may specify the name of a variable. This variable is then evaluated and its numeric value is printed. (For general expressions, define a new dependent variable. If you want to specify the variable name itself, use quotation marks.) The primitive-level If is the only function that may be used outside of a primitive; e.g., If[x < 0, {RGBColor[1,0,0], Point[{x,0,0}]}, {RGBColor[0,0,1], Point[{x,1,0}]}]. There are two important restrictions for the primitive-level If: First, the first argument has to be a (Boolean) expression and all other arguments have to be lists of primitives and directives. (A single primitive or directive is automatically converted to a list of one element; thus, no directive in an argument can have an effect outside of this argument. Recursive lists and recursive primitive-level Ifs are permitted.) Second, any primitives that are in the "false" branches of a primitive-level If are not removed; rather they are just not displayed; however, all other computations are still performed even if this is not necessary. (Thus, there is almost no speed-up compared to displaying all primitives of all branches.)
Expressions in parametrized graphics have to be rather simple. All variables have to be floating-point numbers. (Boolean values are represented by 0. (False) and 1. (True).) This implies that variables cannot be complex or rational numbers, or other objects, e.g. Lists. If any expression evaluates to a complex value (or an undefined result), the whole evaluation fails and LiveGraphics3D uses a prior set of values for independent variable that leads to a successful evaluation. The syntax of expressions is restricted to very few elements: numbers, variables, operators, and built-in functions.
The lexical rules for numbers and variables follow the usual Mathematica conventions. Any variable has to be either an independent variable, i.e. it occurs in the list specified by INDEPENDENT_VARIABLES, or a dependent variable, i.e. it occurs in the list specified by DEPENDENT_VARIABLES, or it is one of the built-in mathematical constants. (The time parameter of an Animate object has to be included in the list of independent variables.)
The operators of Mathematica supported by LiveGraphics3D are listed in the table below.
|operator form
|full form
|Power[expr1, expr2]
|Times[-1, expr]
|expr1 / expr2
|expr1 (expr2)^-1
|(e / e) / e
|expr1 expr2 expr3
|Times[expr1, expr2, expr3]
|e e e
|expr1 * expr2 * expr3
|Times[expr1, expr2, expr3]
|e * e * e
|expr1 + expr2 + expr3
|Plus[expr1, expr2, expr3]
|e + e + e
|expr1 - expr2
|expr1 + (-1 expr2)
|(e - e) - e
|expr1 == expr2
|Equal[expr1, expr2]
|e == e == e
|expr1 != expr2
|Unequal[expr1, expr2]
|e != e != e
|expr1 > expr2
|Greater[expr1, expr2]
|e > e > e
|expr1 >= expr2
|GreaterEqual[expr1, expr2]
|e >= e >= e
|expr1 < expr2
|Less[expr1, expr2]
|e < e < e
|expr1 <= expr2
|LessEqual[expr1, expr2]
|e <= e <= e
|expr1 && expr2 && expr3
|And[expr1, expr2, expr3]
|e && e && e
|expr1 || expr2 || expr3
|Or[expr1, expr2, expr3]
|e || e || e
LiveGraphics3D supports quite a few of Mathematica's functions, especially functions listed in the help browser's category "Mathematical Functions". In particular, most of the functions included in the subcategories "Basic Arithmetic", "Mathematical Constants", "Numerical Functions", and "Elementary Functions" are supported. A few other mathematical and non-mathematical functions are also supported. Note that all arguments and results are restricted to real values, i.e. if any argument or result is complex, the function will fail. The tables below list the supported functions. Note that only the indicated number of arguments is supported. Also note that some functions are only roughly approximated, in particular the factorial-related functions.
|Basic Arithmetic
|Plus[expr1, expr2, ...]
|expr1 + expr2 + ...
|Subtract[expr1, expr2, ...]
|expr1 - expr2 - ...
|Times[expr1, expr2, ...]
|expr1 expr2 ...
|Subtract[expr1, expr2]
|expr1 - expr2
|Divide[expr1, expr2]
|expr1 / expr2
|Power[expr1, expr2, ...]
|expr1 ^ expr2 ^ ...
|Mathematical Constants
in LiveGraphics3D: NaN (not a number)
|Numerical Functions
|Max[expr1, expr2, ...]
|Min[expr1, expr2, ...]
|in LiveGraphics3D: expr
|in LiveGraphics3D: 0
|in LiveGraphics3D: expr
|in LiveGraphics3D: 0 or Pi
|Mod[expr1, expr2]
|Quotient[expr1, expr2]
|Random Numbers
|Elementary Functions
|Log[expr1, expr2]
|Power[expr1, expr2, ...]
|expr1 ^ expr2 ^ ...
|ArcTan[expr1, expr2]
|Factorial Related
|Binomial[expr1, expr2]
|Multinomial[expr1, expr2, ...]
|Pochhammer[expr1, expr2]
|Beta[expr1, expr2]
|Number Theory
|Mod[expr1, expr2]
|PowerMod[expr1, expr2, expr3]
|Quotient[expr1, expr2]
|Hypergeometric Related
|Erf[expr1, expr2]
|Beta[expr1, expr2]
|Generalized and Related Functions
|DiscreteDelta[expr1, expr2, ...]
|KroneckerDelta[expr1, expr2, ...]
|UnitStep[expr1, expr2, ...]
|Numerical Computation
|in LiveGraphics3D: expr
|Programming > Tests
|Equal[expr1, expr2, ...]
|expr1 == expr2 == ...
|Unequal[expr1, expr2, ...]
|expr1 != expr2 != ...
|Less[expr1, expr2, ...]
|expr1 < expr2 < ...
|Greater[expr1, expr2, ...]
|expr1 > expr2 > ...
|LessEqual[expr1, expr2, ...]
|expr1 <= expr2 <= ...
|GreaterEqual[expr1, expr2, ...]
|expr1 >= expr2 >= ...
|in LiveGraphics3D: True (1.0)
|in LiveGraphics3D: True (1.0)
|in LiveGraphics3D: True (1.0)
|Programming > Logical Operations
|And[expr1, expr2, ...]
|expr1 && expr2 && ...
|Or[expr1, expr2, ...]
|expr1 || expr2 || ...
|Xor[expr1, expr2, ...]
|Implies[expr1, expr2]
|in LiveGraphics3D: 1.0
|in LiveGraphics3D: 0.0
|Programming > Flow Control
|If[expr1, expr2]
|If[expr1, expr2, expr3]
|If[expr1, expr2, expr3, expr4]
|Which[expr1, expr2, ...]
|(even number of arguments!)
|Switch[expr1, expr2, expr3, ...]
|(uneven number of arguments!)
|Programming > Functional Programming
|Programming > Evaluation Control
|in LiveGraphics3D: expr
|in LiveGraphics3D: expr
|in LiveGraphics3D: expr
|in LiveGraphics3D: expr
|in LiveGraphics3D: expr
|Input and Output > Format Types
|in LiveGraphics3D: expr
|in LiveGraphics3D: expr
|in LiveGraphics3D: expr
|in LiveGraphics3D: expr
|in LiveGraphics3D: expr
|in LiveGraphics3D: expr
|Input and Output > Number Formatting
|in LiveGraphics3D: expr
|in LiveGraphics3D: expr
|in LiveGraphics3D: expr
|in LiveGraphics3D: expr
|System Interface > Time and Date
Formatting Text (new in version 1.90)
In LiveGraphics3D the first argument of the Text primitive is restricted to a very small subset of Mathematica expressions. This subset allows for simple annotations of graphics with mathematical notation but does not support type-setting of complex equations. The same restrictions also apply for text expressions specified in the PlotLabel, AxesLabel and Ticks options. Basically, a text expression may be a string (enclosed in double-quotes: "..."; or enclosed in two pairs of single quotes: ''...''), a number, an identifier (which is evaluated to a number in cases of variables specified by the applet parameters INDEPENDENT_VARIABLES or DEPENDENT_VARIABLES), or one of the formatting functions StyleForm, HoldForm, SequenceForm, StringForm, Subscript, Superscript, Subsuperscript, Underscript, Overscript, Underoverscript, UnderBar, OverBar, OverVector, OverHat, OverTilde, and OverDot. The arguments of most of these functions may also be text expressions. A more formal description of the grammar for text expressions in LiveGraphics3D is given in the table below, which also includes the valid options for StyleForm (and for the Graphics3D option TextStyle). For more information about these functions, please consult the documentation of Mathematica. Here we will only discuss differences specific to LiveGraphics3D.
|expr ::=
|string |
|number |
|identifier |
|(evaluates to a number if it is a known variable)
|StyleForm[expr, opt , ...] |
|(see below for the definition of valid options opt)
|HoldForm[expr] |
|(prevents variables in expr from being evaluated)
|StringForm[string, expr , ...] |
|SequenceForm[expr, ...] |
|Subscript[expr, expr] |
|Superscript[expr, expr] |
|Subsuperscript[expr, expr, expr] |
|Underscript[expr, expr] |
|Overscript[expr, expr] |
|Underoverscript[expr, expr, expr] |
|UnderBar[expr] |
|OverBar[expr] |
|OverVector[expr] |
|OverDot[expr] |
|OverHat[expr] |
|opt ::=
|FontFamily->string |
|(default: "Courier")
|FontSubstitutions->{string->string, ...} |
|(see note below for default)
|FontSize->number |
|(default: 10)
|FontWeight->string |
|(default: "Plain")
|FontSlant->string |
|(default: "Plain")
|FontColor->color |
|(color is a color directive, e.g., RGBColor)
|Background->color |
|ScriptSizeMultipliers->number |
|(default: 0.71)
|ScriptMinSize->number |
|(default: 4)
|ScriptBaselineShifts->{number, ...} |
|(default: {0.6, 0.9, 0.9, 1.2})
|(non-Mathematica option)
Note on text formatting functions within Mathematica: In order to use text formatting functions such as StringForm, Subscript, etc. within Mathematica for LiveGraphics3D, you should not use the Format function because the text formatting functions will not appear in the InputForm of a symbol formatted this way. Instead, you should define a separate symbol directly with text formatting functions, e.g.:
symB[i_,t_] := StringForm["`1`(`2`)", Subscript["B", i], t]
With this definition, symB[n, x] will usually be printed as Bn(x) within Mathematica but the InputForm will be StringForm["`1`(`2`)", Subscript["B", n], x]. This InputForm should be sent to LiveGraphics3D, which will print it as Bn(x).
Note on overscripts, underscripts, and baseline shifts: All formatting functions and in particular UnderBar, OverBar, etc. can only approximate the corresponding Mathematica functions. The first reason is that the implementation in LiveGraphics3D uses other characters than Mathematica to support more platforms and fonts. Another reason is the applet's unability to determine the height of an individual character; therefore, Overscript and Underscript will choose baseline shifts that are too large in order to guarantee non-overlapping characters with the default setting ScriptBaselineShifts->{0.6, 0.9, Automatic, Automatic} For UnderBar, OverBar, etc. LiveGraphics3D chooses different baseline shifts (default in these cases: ScriptBaselineShifts->{0.6, 0.9, 0.9, 1.2}) to better approximate the rendering in Mathematica. These shifts might be too small or too large depending on the specific platform, the chosen font, and the characters. In order to correct this, LiveGraphics3D allows you to specify a third and fourth number in the list given to the option ScriptBaselineShifts. These numbers have the same meaning as the first and second element but for underscripts and overscripts instead of subscripts and superscripts. The units of all four numbers are supposed to be the height of an "x", which is approximated by half the maximum height (ascent) of any character in the current font.
Examples: OverVector["v"] is represented internally as
StyleForm[Overscript["v","\[RightArrow]"], ScriptBaselineShifts->{0.6, 0.9, 0.9, 1.2}]
The baseline shift of 1.2 was chosen to generate a reasonable rendering for
all characters of the current font; thus, for a lower-case character such as
"v" it is usually too large. In order to reduce it to 1.0, you could use:
StyleForm[OverVector["v"], ScriptBaselineShifts->{0.6, 0.9, 0.9, 1.0}]
This doesn't affect the rendering in Mathematica (the third and fourth element
of the list are ignored by Mathematica) but improves the rendering by the applet.
If you want to use the same character as Mathematica for OverVector
(unicode 8640 instead of 8594) you should use:
StyleForm[Overscript["v","\[RightVector]"],ScriptBaselineShifts->{0.6, 0.9, 0.9, 1.0}]
However, this unicode character is included in fewer fonts; thus, the last
example will appear incorrect on some machines.
Note on special characters: There are many special characters in Mathematica which cannot be rendered by LiveGraphics3D. Nonetheless, LiveGraphics3D will send the correct unicode for most of these special characters to the Java Virtual Machine. If the particular unicode is supported by the font employed by the Java Virtual Machine, then at least a similar character will be rendered. However, many characters of Mathematica are application-specific unicode characters; thus, there is almost no chance to render them correctly.
Note on font subsitutions: The StyleForm option FontSubstitutions maps font names without trying the original names. The default is {"Times"->"TimesRoman", "TimesNewRoman"->"TimesRoman", "Roman"->"TimesRoman", "Arial"->"Helvetica", "Geneva"->"Helvetica", "System"->"Helvetica", "CourierNew"->"Courier", "Typewriter"->"Courier", "Monotype"->"Courier"}. "TimesRoman", "Helvetica", and "Courier" are the standard font families for Java 1.0. In Java 1.1 the standard font families are "Serif", "SansSerif", and "Monospaced"; but the Java 1.0 names are probably supported by more Java Virtual Machines. If you specify other FontSubstitions make sure to consider at least the substitution of "Times" by "TimesRoman" because the Mathematica documentation recommends the name "Times" for a serif font, while some Java Virtual Machines will actually use a sansserif font when an applet asks for the "Times" font. Since LiveGraphics3D performs no checking of the font returned by the Java Virtual Machine, it is quite unsafe to ask for any font except "TimesRoman", "Helvetica", and "Courier"; thus, all FontSubstitutions should map names to one of these three names (or one of the three Java 1.1 alternatives "Serif", "SansSerif", and "Monospaced").
Note on URLs: The non-Mathematica option URL may be set to a string containing a URL. If specified it changes the text primitive into a hyperlink. (If multiple URL options occur in one text primitive, one option is chosen by the applet.) Moreover, the string ",target=" may be appended followed by a "target" specification (as in the TARGET attribute of the HTML A tag). Here is a real-life example:
Text[StyleForm["Mathematica\.ae", FontFamily->"Times", FontSlant->"Italic", FontSize->20, URL->"http://www.wolfram.com,target=_self"], {1,1,0}, {0,-1}]
This appendix describes most of the limitations of LiveGraphics3D compared to Mathematica.
All kinds of non-decimal numbers are not allowed. This is, however, no problem as all numbers have to be "numeric" anyway, thus it is always possible to use N[...] in order to make things work.
FontForm objects and the option DefaultFont are obsolete in Mathematica 3.0; thus, LiveGraphics3D does not support them. The first argument of the Text primitive is restricted as discussed above. All options to the Text primitive are ignored; please use an option of a StyleForm function instead. If specified, the Graphics3D option TextStyle has to be set to a list of StyleForm options.
There is subtle limitation of the primitive Cuboid. In short, the following four forms are not supported:
Cuboid[{..., ..., ...}, Scaled[{..., ..., ...}]] Cuboid[Scaled[{..., ... , ...}], {..., ..., ...}] Cuboid[Scaled[{..., ..., ...}], Scaled[{..., ..., ...}, {..., ..., ...}]] Cuboid[Scaled[{..., ..., ...}, {..., ..., ...}], Scaled[{..., ..., ...}]]
More important are the graphics directives that are not supported by LiveGraphics3D:
AbsoluteDashing[...] Dashing[...]
(The scapegoat Java does not support dashed lines.)
Here is the list of ignored Graphics3D options:
These options are always set to their default values; except SphericalRegion, which is set to True, and ImageSize which is set to the values of the applet's attributes WIDTH and HEIGHT.
LiveGraphics3D does not "break" intersecting polygons, thus they are displayed incorrectly. In fact a quite simple painter algorithm is used to hide surfaces, which is far from being as good as the algorithms used in Mathematica. (Mathematica does offer to do this "breaking" for programs like LiveGraphics3D via the option PolygonIntersections, but it seems to produce always far too many polygons to be of any use.)
Because of this simple painter algorithm, occlusions of (in particular, large) graphical primitives are often incorrect. Sometimes it is possible to reduce or avoid these problems by breaking primitives into smaller ones within Mathematica (in particular, long lines should be avoided).
LiveGraphics3D does not clip primitives which are outside of the PlotRange.
In some situations the color of the wrong face of a polygon is used. The reason is the simple (but fast) alogrithm being used to decide which face is painted.
The shading is fixed, i.e. light sources are rotating with the graphics. Furthermore there are differences between the shading of Mathematica and LiveGraphics3D regarding the coordinate system in which light sources are defined and the formula for specular shading. There are also differences between Mathematica and its documentation, thus I do not take this point too seriously.
Thickness and PointSize specify lengths in units of the length of the diagonal of the bounding box (not in units of the width of the whole plot; however with SphericalRegion->True, which is always enforced by LiveGraphics3D, and a not too small ViewPoint vector there is almost no difference). Thus the thickness of lines and the size of points depends on the distance to the viewer, which is quite reasonable for three-dimensional graphics. On the other hand AbsoluteThickness and AbsolutePointSize specify constant lengths in pixels (not in printer points).
Text primitives may be hidden by other primitives.
PlotLabels appear at the top of the graphics (and not above the graphics). The value is restricted in the same way as the first argument of the Text primitive. (See above.)
There are some other small syntactical differences. For example EdgeForm is not allowed to have more than one argument (as documented in the Mathematica Book), while Mathematica seems to accept any number of arguments.
Revision History
This project was started on August 8th, 1997 as "Live.java". It was renamed to LiveGraphics3D with version -2.02. All changes since version -2.00 are listed here.
improved calculation of normals of polygons
scanning of integers with integer arithmetic
FaceForm with one argument
improved PlotRange
implemented ShowAnimation
incompatible change of MAGNIFICATION if Ticks or AxesLabel are used
animations accelerated
double clicking to stop/restart animations
default value of AnimationDisplayTime now 0.05
improved double clicking
implemented stereo graphics
changed effect of CONTROL + horizontal dragging
removed problem with first click on animations
implemented INITIAL_ROTATION
corrected Hue
improved drawing of thin lines
|additional default light source
|implemented VISIBLE_FACES
implemented spinning including SPIN_X and SPIN_Y
improved calculation of normals of polygons (once again)
implemented identification of lines which are edges of polygons
|implemented AUDIO_... parameters
implemented PlotLabel
improved dragging interface
switched to Java 1.1 and Java archive live.jar
reimplemented spinning interface
implemented INPUT_ARCHIVE
added start-up picture
improved spinning interface
improved work-around for IE applet size bug
parameter INPUT is now obsolete
|implemented PRELOAD_BACKGROUND
implemented third argument of Polygon
implemented HOME key
improved parsing of real parameters
SPIN_X and SPIN_Y are now reals
"o" key is printing SPIN_X and SPIN_Y
debugged INITIAL_ROTATION
implemented stopping
implemented ",target=" extension of URL option
implemented control methods for J/Link
INPUT parameter no longer obsolete
|included work around for bug in the JIT compiler of the Microsoft Java Virtual Machine
|implemented parametrized graphics, including Animate, INDEPENDENT_VARIABLES, DEPENDENT_VARIABLES, and MOUSE_DRAG_ACTION.
fixed n-gon bug (n > 4)
implemented more control and query methods
introduced a serious bug (don't use this version!)
fixed IE problem with small points
fixed problem with Scaled coordinates (not really)
replaced deprecated String() constructor
|fixed the bug introduced in 1.20
fixed bug with very small PointSize and Thickness
added set/getPlotRange functions
switched to another Java compiler
|fixed bugs with Scaled, Which, and Switch
implemented STRIPPED_PRIMITIVES
implemented rotateToViewPointAndViewVertical and setInputFile
made AnimationDisplayTime also an option of Graphics3D
implemented evaluation of atomic variables as first argument of Text
implemented startAnimation, stopAnimation, isAnimationPlaying
fixed bug in setFrame
implemented primitive-level If
improved robustness of applet
implemented version of setGraphics3D for parameterized graphics
fixed problem with empty list of variables
fixed problem with PlotLabel and AxesLabel for animations
implemented simple text formatting for sequences, subscripts, superscripts,
underscripts, and overscripts; and options for font sizes and
placement of scripts.
updated LiveForm (because of problems with SequenceForm) and the section about J/Link (because of problems with double quotes)


text:
Neighbors helping Neighborsby Staff Sgt. Wayne Woolley, Department of Military and Veterans Affairs Public Affairs
Pfc. James H. Campell provides assistance to Lawrenceville residents from flooding areas on Aug. 28. Several areas in Lawrenceville have flooded because of the heavy rains and winds caused by the passing of Hurricane Irene. (U.S. Air Force photo by Master Sgt. Mark C. Olsen, 177th Fighter Wing Public Affairs)
Hurricane Irene did not spare Sgt. 1st Class Marco Chavez. The rising floodwaters swept into the New Jersey Army National Guard Soldier's home in Fairfield, causing massive damage and forcing the evacuation of his family.
But when the storm hit, Chavez was among the nearly 2,400 Citizen Soldiers and Airmen who reported for duty to protect the property, safety and lives of their fellow New Jerseyeans. When Gov. Chris Christie met Chavez several days later, the 46-year-old Iraq veteran – and his 20-year-old son, Pfc. Angel Chavez – were still with the mission to help friends and neighbors recover from the devastating storm. When asked why, Chavez simply replied: "This is what we do. This is where we need to be right now."
The most remarkable thing about the National Guard's largest domestic mobilization in more than 30 years was that Chavez's story is not uncommon at all. Scores of Soldiers and Airmen from Cape May to Riverdale left their homes and families in a time of crisis. They are part of an all-volunteer force that reflexively puts the needs of their communities' before their own.
Countless examples of selfless sacrifice formed the backbone of the New Jersey National Guard's unprecedented response to a storm Gov. Christie described as a 100 year event.
As the state's military first responders, Soldiers and Airmen rescued 543 residents imperiled by rising water and conducted hundreds of missions in direct support of civilian authorities on assignments ranging from rescues, to safeguarding property to transporting relief supplies. Young men and women logged thousands of miles in high-wheeled vehicles on treacherous roads with few incidents and no injuries. Helicopter pilots and crews flew dozens of missions to gauge where to best marshal resources. Soldiers and Airmen also played key roles in the operation of the state's emergency evacuation shelters.
To get a fuller appreciation of the National Guard response to the storm, remember that as devastating as this storm was, the initial predictions called for Category II hurricane packing 115 mile winds to make landfall at Cape May and to head due north through the center of the state.
In the hours after the storm made landfall, it became clear Hurricane Irene's greatest threat would not be destructive winds, but epic flooding in Central and Northern New Jersey.
The National Guard responded to the shifting threat by rapidly reconsolidating Soldiers, Airmen and equipment in Somerset, Passaic, Essex and Bergen counties before the hurricane officially exited New Jersey and long before rivers reached flood stage. From there, it was a textbook example of the National Guard responding to requests for assistance from its partners at the Office of Emergency Management and the State Police.
As the floodwaters receded, the National Guard began its drawdown at a pace commensurate with the remaining threat. The rationale was simple. The overall government emergency response required by storms of that magnitude is expensive. Although the Soldiers and Airmen of the National Guard are already a great value to the taxpayer because of their part-time pay structure, the National Guard leadership team understood the need to be good financial stewards.
The National Guard's response to Hurricane Irene required intricate planning, preparation for multiple contingencies and a complicated analysis and reaction to an emerging threat.
Even though Soldiers and Airmen drove thousands of miles without incident, the chaotic nature of the storm and an aggressive push by Soldiers led to an incident in which two vehicles became stranded in floodwaters in Manville. Video images of this episode were posted on a social networking site and received coverage from some news outlets.
A commanders' inquiry and safety investigation was undertaken in response.
But in that case, as in all the hundreds of other missions successfully completed by the National Guard, the Soldiers and Airmen made an aggressive push in response to one of the nastiest storms in memory in a determined effort to save lives and protect property.
Let's remember two other things that happened during Hurricane Irene that didn't make the news.
The first came less than 72 hours after the storm landed, when a large group of Soldiers demonstrated the versatility of today's National Guard, boarding a plane at Joint Base McGuire-Dix-Lakehurst to begin a one-year deployment in Iraq and Kuwait. They joined more than 15,000 other New Jersey National Guard troops who have contributed to our nation's defense by serving under combatant commanders around the globe over the past decade.
The second came later that day, in Manville, when a number of Soldiers joined Gov. Christie at a town hall event at a VFW Post surrounded by waist-high water. When this gathering of residents, emergency workers and elected officials spotted the uniforms, a spontaneous chant broke out. It was: "National Guard, National Guard."
Folks in that VFW Hall that day recognized that the New Jersey National Guard is the Hometown Team. They are their friends and neighbors who volunteered to serve and can be counted on to step up when they are needed most.
|(c) 2011 NJ Department of Military and Veterans Affairs

subset: commoncrawl


text:
61-80: Questions and Answers
61- Why is prayer important?
Five regular daily prayers, among the most important observances after faith itself, are acts of worship which believers are commanded to carry out throughout their lives at the specific times appointed.
Human beings are prone to forgetfulness and heedlessness. If they fail to use their will and become caught up in the flow of their day-to-day activities, then they become distanced from those subjects they really ought to be concentrating on. They may forget that Allah surrounds them in every possible way, that He sees and hears them at every moment, that they will account to Him for all their deeds, the existence of Paradise and Hell, that nothing takes place outside destiny and that there is something auspicious in all events. Falling into heedlessness may cause people to neglect the true purpose behind their lives.
The prayer, however, which is performed five times daily, eliminates this forgetfulness and neglect, and keeps a believer's consciousness and will alive. It ensures that the believer constantly turns to Allah and helps him lead a life directed towards the observance of our Creator's commandments. The believer who stands in the presence of Allah ready to perform the prayer establishes a powerful spiritual bond with our Lord. One verse describes how the prayer reminds a person of Allah and prevents all forms of wickedness:
Recite what has been revealed to you of the Book and perform prayer. Prayer precludes indecency and wrongdoing. And remembrance of Allah is greater still. Allah knows what you do. (Surat al-'Ankabut, 45)
62- Were other prophets commanded to perform the prayer?
The prayer has been made obligatory for all believers, from the prophets on down. All the prophets sent to mankind throughout the course of history have preached this observance, made obligatory by Allah, and have been role models for all believers by performing that obligation in the finest and truest manner possible. The Qur'an contains several verses regarding the prophets being commanded to perform the prayer, the scrupulous way they performed and maintained it, and the way they passed that command on to their own societies. Some of these verses read:
- For the Prophet Ibrahim (as):
"My Lord! Make me and my descendants people who perform prayer. My Lord! Accept my prayer." (Surah Ibrahim, 40)
- For the Prophet Isma'il (as):
Mention Isma'il in the Book. He was true to his promise and was a Messenger and a Prophet. He used to command his people to perform prayer and give the alms and he was pleasing to his Lord. (Surah Maryam, 54-55)
- For the Prophet Musa (as):
I am Allah. There is no Deity but Me, so worship Me and perform prayer to remember Me. (Surah Ta Ha, 14)
The blessed Maryam, a role model for female believers, was also commanded to perform the prayer:
Maryam, obey your Lord and prostrate and bow with those who bow. (Surah Al 'Imran, 43)
The Prophet 'Isa (as) also received that same commandment from Allah:
He said, "I am the servant of Allah, He has given me the Book and made me a Prophet. He has made me blessed wherever I am and directed me to perform prayer and give the alms as long as I live." (Surah Maryam, 30-31)
63- At what times has the prayer been made obligatory?
The times of this obligatory observance have been stipulated for believers in the Qur'an. The relevant verse reads:
When you have finished prayer remember Allah standing, sitting and lying on your sides. When you are safe again perform the prayer in the normal way. The prayer is prescribed for the believers at specific times. (Surat an-Nisa, 103)
There are five timings for the prayer; "morning," "noon," "afternoon," "evening" and "night." These are clearly set out in several verses in the Qur'an, one of which reads:
So be steadfast in the face of what they say and glorify your Lord with praise before the rising of the sun and before its setting. And glorify Him during part of the night and at both ends of the day, so that hopefully you will be pleased. (Surah Ta Ha,130)
Our Prophet (saas), who best understood and commented on the Qur'an through the revelation and inspiration of Allah, also described the timings of the five prayers in the day. One of the hadiths in which the timings of the prayer are revealed is that reported by 'Abdullah b. 'Amr:
The time of the noon prayer is when the sun passes the meridian and a man's shadow is the same (length) as his height, (and it lasts) as long as the time for the afternoon prayer has not come; the time for the afternoon prayer is as long as the sun has not become pale; the time of the evening prayer is as long as the twilight has not ended; the time of the night prayer is up to the middle of the average night and the time of the morning prayer is from the appearance of dawn, as long as the sun has not risen.
Both the verses of the Qur'an and the sound hadiths of our Prophet (saas), as well as statements by Islamic scholars, show that there are five timings for the prayer and that there can be no debate over this.
The five daily prayers, with their fards (obligatory), wajibs (compulsory) and sunnahs, consist of 40 rakats (units), as follows:
- Salat al-fajr (morning prayer): sunnah prayer consisting of 2 rakats, fard prayer consisting of 2 rakats
- Salat al-zuhr (noon prayer): initial sunnah prayer consisting of 4 rakats, fard prayer consisting of 4 rakats, final sunnah prayer consisting of 2 rakats
- Salat al-'asr (afternoon prayer): sunnah prayer consisting of 4 rakats, fard prayer consisting of 4 rakats
- Salat al-maghrib (evening prayer): fard prayer consisting of 3 rakats, sunnah prayer consisting of 2 rakats
- Salat al-'isha (night prayer): initial sunnah prayer consisting of 4 rakats, fard prayer consisting of 4 rakats, final sunnah prayer consisting of 2 rakats and witr prayer consisting of 3 rakats.
64- How does one perform the prayer with khushu'?
Performing the prayer with khushu' means performing this obligation through feeling an enormous awe of Allah, in the consciousness of being in His presence and feeling His majesty and greatness in one's heart. In the prayer, a believer who is aware that he is in the presence of Allah, the Lord of the worlds, will experience that majesty and fear, and the closeness he feels to Allah will be proportionate to that fear and awe.
A believer who wishes to perform the obligation of the prayer in a proper manner must take precautions against anything that might prevent that state of the heart and try to establish the requisite attention and concentration.
Allah tells us that when we stand in His presence we must remember Him alone, praise Him and express His Oneness, as the One Who is unfettered by any deficiency. The surahs and supplications unanimously agreed by the Ahl al-Sunnah should be recited in the prayer. Performing the prayer in the proper manner is a great opportunity for wholeheartedly praising our Lord. Indeed, in one verse Allah states the prayer is to be performed in remembrance of Him:
I am Allah. There is no Deity but Me, so worship Me and perform prayer to remember Me. (Surah Ta Ha, 14)
65- What does a person who starts living by religious morality have to change about himself?
In addition to obeying Allah's orders and performing the rites of worship, the most important change a person who starts living by religious morality should make is adopt a life built on good morals by always following his conscience. Everyone will have the character and way of life he adopted before becoming acquainted with religion. However, when he starts living by religious morality, he must perpetuate his good character traits for the approval of Allah, and immediately abandon those that do not meet the standards of the Qur'an, or remould them in line with the morals of the Qur'an.
True believers will not have different world views, life styles or viewpoints. The only criterion for them is the Qur'an and the sunnah, and the only models to be followed are the Prophet Muhammad (saas), the prophets and righteous believers whom Allah gives as examples in the Qur'an.
66- After I start living Islam, will I be responsible before Allah for the sins I have committed in my past life?
Before he is warned, a person would be considered ignorant about religion, with no knowledge of what is right or wrong. Therefore, if he repents and does not revert to the same sins and mistakes and seeks forgiveness from Allah, he will not be held responsible for his sinful past. What is important in Allah's Sight is not to try to justify any mistakes or sins. Allah has given the believers this good news:
As for those who believe and do good deeds, We will cleanse them of their sins, and recompense them for the best of their deeds. (Surat al-'Ankabut, 7)
67- Is it necessary to explain the morals of Islam to others?
Allah holds it the responsibility of all people to live the religion of Islam. Everyone who is aware of the existence of the religion will be asked in the hereafter whether he has abided by the Qur'an or not. Therefore, those who live Allah's religion must convey the good morals laid down in the Qur'an to other people, inviting them to the righteous way, urging them to do right and forbidding them to do wrong. In the Qur'an, Allah gave the following commandment:
Let there be a community among you who call to the good, and enjoin the right, and forbid the wrong. They are the ones who achieve success. (Surat Al 'Imran, 104)
68- In what sense does Allah appreciate patience?
In the Qur'an, Allah tells man to be patient for His sake. In a verse, it is commanded: "Be steadfast for your Lord." (Surat al- Muddaththir, 7) One of the most significant qualities of man which is inseparable from the good morals he upholds and the good deeds he performs to gain Allah's approval is patience.
Yet, we must distinguish between patience and "tolerance". Tolerance is the virtue of enduring any inconvenience that is unpleasant or painful. However, patience, as referred to in the Qur'an, is not a source of difficulty for the believer. The believer exercises patience in order to gain the approval of Allah, therefore he does not suffer any distress because of his patience; on the contrary, he derives spiritual pleasure from it.
Also, patience is an attribute that covers all the characteristics of a believer as set forth in the Qur'an, for a person may be humble, generous, sacrificing and obedient, but these qualities will be truly valuable only if he perseveres with patience in maintaining them. This means that patience is an attribute which renders all other attributes of a believer valuable and valid.
69- What does "putting trust in Allah" mean?
Putting trust in Allah is counting on Allah knowing that everything on the earth takes place under Allah's control and that no one can help or harm the individual unless He so wills. The believers know that Allah is the Almighty and anything He desires will happen just by His saying "Be!" and they never lose heart in the face of difficulties. They know that Allah will help them no matter what, and that He wishes comfort for them in this world and in the hereafter. They live a life of inner peace and joy caused by this awareness.
What falls to a believer is just to give the reactions Allah wants him to give and to wait the result from Allah. In verses, this great secret only understood by the believers is explained as follows:
... Whoever goes in fear of Allah—He will give him a means of salvation and provide for him from sources which he does not expect. Whoever puts his trust in Allah—He will be enough for him. Allah always achieves His aim. Allah has appointed a measure for all things. (Surat at-Talaq, 2-3)
70- What is taqwa? Who are those who have taqwa?
Taqwa (piety) is to abide by the commands and recommendations of Allah and to avoid adverse thoughts and acts. The believers who believe with certainty and who show unremitting perseverance in this are called "the pious ones" in the Qur'an. Allah informs us of the significance of piety: "… Provide well for yourselves; but the best provision is piety. So fear Me, those of you who are endowed with intelligence! " (Surat al-Baqara, 197)
71- What is superiority based on in the Sight of Allah?
In the Sight of Allah, superiority is not based on the race, possessions, position, beauty or anything else a person may possess, but only on his nearness to Allah, that is, his piety:
Mankind! We created you from a male and female, and made you into peoples and tribes so that you might come to know each other. The noblest among you in Allah's Sight is the one with the greatest piety. Allah is All-Knowing and All-Aware. (Surat al-Hujurat, 13)
72- What is deep thinking?
One of the most important characteristics of those who believe in Allah is their ability to see the signs created by Allah. A believer sees the power and artistry of Allah in every subtlety around him, he glorifies His praise and takes this as a way to draw nearer to him. Believers having this characteristic are thus defined in the Qur'an:
Those who remember Allah, standing, sitting and lying on their sides, and reflect on the creation of the heavens and the earth: 'Our Lord, You have not created this for nothing. Glory be to You! So safeguard us from the punishment of the Fire.' (Surah Al 'Imran, 191)
Allah emphasizes the importance of deep thinking to the believers in many places in the Qur'an with the phrases "Will you not reflect?", "There are signs for those who reflect". The subjects to be reflected on are unlimited. A believer ponders upon many subjects, like the extraordinary order in universe, the living beings on the earth, the perfect systems in these living beings, any event he experiences, the blessings Allah creates ceaselessly, disasters sent down to the unbelievers, Paradise, Hell, and eternity, and with profound thinking, he makes a better appraisal of the existence, might and infinite wisdom of Allah.
73- Religion and science are in agreement.
Religion never conflicts with science. Science is the means to see Allah's artistry. Allah created both religion and science, therefore any discord or conflict between them is impossible. In the Qur'an which Allah sent down 1,400 years ago, there are certain scientific explanations which have now been verified by means of 20th century technology. The claim that religion conflicts with science is a lie made up by those who deny Allah, imagining that they would thus create doubt in people's minds about religion.
74- Who are the scientists who believe in Allah and religion?
Many people who do scientific research see with their own eyes and in full detail the extraordinarily complex structures and the perfect order in living beings, and the great harmony between them. These people inevitably come to the realization of the existence and greatness of Allah. This truth is pointed out by the following verse: "… Only those of His servants with knowledge go in fear of Allah...' " (Surah Fatir, 28)
Some scientists who refuse to heed their consciences and who persist in denial, despite seeing the clear proofs of creation by Allah, are making a grave error. The reason for such people's attitude is purely ideological.
Many renowned scientists of our day and the past are known by their belief and devotion to Allah and religion. Some of these scientists are: Einstein, Newton, Galileo, Max Planck, Kelvin, Maxwell, Kepler, William Thompson, Robert Boyle, Iona William Petty, Michael Faraday, Gregory Mendel, Louis Pasteur, John Dalton, Blaise Pascal, John Ray.
In our day, many scientists confirm the existence of Allah and more, they see science as a means of becoming acquainted with Allah. These include Francis Collins, one of the directors of the Human Genome Project, and the philosopher Anthony Flew, who stated that he now believed after years of being an atheist.
75- How does one give thanks to Allah?
To give thanks for all the blessings Allah has given is an important act of worship. In addition to the verbal expression of thanks, using Allah's blessings in a way that He will be pleased, for charity and good purposes without being extravagant, will also be giving thanks through one's deeds. Also, the individual must know that he needs everything coming from Allah, nothing he owns belongs to him, and everything has been given to him by Allah, and he must at all times give thanks for these things. It is stated in the Qur'an:
So eat the good and lawful (halal) things that Allah has provided for you, and be thankful for the blessing of Allah if you truly worship Him. (Surat an-Nahl, 114)
76- What kind of a being is satan?
Satan is one of the jinn Allah created. After Allah created Adam, who was the first human being, Allah ordered all the angels to prostrate themselves before Adam. Only satan among them did not obey Allah's order, because he was boastful and said:
… My Lord, because You misled me, I will make things on the earth seem good to mankind and I will mislead them all, every one of them. (Surat al-Hijr, 39)
Satan, who was expelled out of the Sight of Allah, asked Allah to give him time until the day of resurrection to keep all of mankind away from Allah's path and to misguide them all. In the meantime, satan will try to cause people go astray from Allah's path and he will do his best to achieve this. Therefore, satan is the greatest danger to the successful after life of every human being and he is thus everyone's greatest enemy.
77- How does satan reach people? By what methods does he try to make them stray from their course?
Allah mentions in the Qur'an that satan whispers evil suggestions in people's hearts. Believers are advised to seek refuge in Allah "from the evil of the surreptitious whisperer who whispers in people's breasts." (Surat an-Nas, 4-5) This is the most insidious tactic of satan. Most people do not realize that the thoughts in their minds are from satan. They think that all their thoughts are their own. For instance, someone who is just learning religion is an important target for satan. He may make religion seem difficult to this person. Or he may tell him that what he already does is enough and more is not required. This person may think that all this is true. Or satan induces feelings like fear, anxiety, stress, and distress in people, and aims to exhaust their energy. He tries to prevent them from doing good and charitable deeds and thinking soundly. One must be aware that all these things come from satan, seek refuge in Allah and pay no heed to satan's whisperings. Furthermore, it must not be forgotten that satan's influence on people lies at the root of all evil, wars, massacres and debauchery in the world.
78- Does satan have independent power of his own?
The most important point to be grasped about satan is that he has no power of his own. Like all other beings, he has also been created by Allah and is under His control. He can do nothing unless Allah so wills. Satan performs his task of causing people to go astray with the permission of Allah. In this way, Allah tests who will and who will not obey satan in the life of this world, which He created to test people. Allah states this truth:
He had no authority over them except insofar as We might be enabled to distinguish one who believes in the hereafter from one who is in doubt about it. Your Lord is the Preserver of all things. (Surah Saba, 21)
79- On whom does satan have no influence?
Satan can have no influence on true believers. Allah tells us of this truth in the 99th and 100th verses of Surat an-Nahl:
He has no authority only over those who believe and who put their trust in their Lord. He has authority only over those who take him as a friend and who associate others with Allah. (Surat an-Nahl, 99-100)
80- What is "the religion of the ignorant?"
Do they then seek the judgement of the Time of Ignorance? Who could be better at giving judgement than Allah for those whose faith is steadfast? (Surat al-Ma'ida, 50)
There is a common false "religion" on earth that all people, regardless of their ideologies, philosophies or world views, who have strayed from the religion of truth, adopt. This false religion is conformed to in all societies where the religion of truth is not adhered to. In such societies, people accept the value judgements, norms and mindset offered by this false religion as a result of the intense inculcation they receive from their environment from the moment they come into this world. The name of this religion is "the religion of the ignorant".
The basic characteristic of people who live the religion of the ignorant is their seeking the approval of the society they live in rather than the approval of Allah, and their building their lives around the axis of this aim.
What is expected of the individuals living in such societies is to "become a man." What is meant by the term "to become a man" is to adopt certain type of culture, attitude and mindset commonly accepted by society and to exhibit certain traits that are favoured by the members of this society. (Further reading on the subject: Harun Yahya, The Religion Of The Ignorant)


text:
Jump to navigation
The SAIC Thesis Repository is a digital archive of recent, print theses produced by the students of the School of the Art Institute of Chicago. Beginning in November 2013, new theses are digitized as they are received by the library. Works in this repository can be read online from any location on the SAIC campus. Theses cannot be printed or copied from this repository, nor can texts be read off campus. (Only descriptive information and abstracts are available for browsing by outside visitors.) Archival paper copies of theses are kept in the SAIC/AIC libraries.
Browse Collection | SAIC Undergraduate Degrees | SAIC Graduate Degrees


text:
The Azure Code Samples are currently available in English
Getting Started with Aad - Manage Users Groups And Roles - in .Net
Azure Users, Groups and Roles sample.
- List users
- Get user by email
- Assign role to AD user
- Revoke role from AD user
- Get role by scope and role name
- List roles
- List Active Directory groups.
Running this Sample
To run this sample:
Set the environment variable
AZURE_AUTH_LOCATION with the full path for an auth file. See how to create an auth file.
git clone https://github.com/Azure-Samples/aad-dotnet-browse-graph-and-manage-roles.git
cd aad-dotnet-browse-graph-and-manage-roles
dotnet restore
dotnet run
More information
Azure Management Libraries for C# Azure .Net Developer Center If you don't have a Microsoft Azure subscription you can get a FREE trial account here
This project has adopted the Microsoft Open Source Code of Conduct. For more information see the Code of Conduct FAQ or contact email@example.com with any additional questions or comments.


text:
Yancey Quinones in freshly painted tunnel entrance/Photo by Nathan Solis
Getting excited over tunnel gallery opening
Story and Photos by Nathan Solis
Yancey Quinones stands in the pedestrian tunnel under North Figueroa Street, his arms stretched out, his voice echoing off the walls. For years the Cypress Park tunnel had been closed to the public, but now, thanks to Quinones, it'll soon be reopened this Saturday night – as an art space.
"It's going to be the community's tunnel, safe, secure," Quinones says pointing to newly installed LED lights and freshly painted walls of the tunnel at Figueroa and Loreto Street near Nightengale Middle School.
As a child growing up in the neighborhood, Quinones remembers walking through the tunnel and how over the years the neighborhood's gangs forced the city to close it. Now as the owner of Antigua Cultural Coffee House a few yards from the tunnel's east entrance, Quinones looks to repurpose the underground passage as an open–albeit narrow–art gallery.
Loreto Street, where the coffee house and the tunnel entrance sit, is a blank canvas to Quinones – he speaks about grand projects, like turning the street into a cul-de-sac, what he calls "a village in the city," and he also wants to repurpose an empty garage that's next to the tunnel.
"Like a snail, it's going to take time, but eventually we'll get there," he says a few days before the tunnel gallery's debut as part of NELA's art walk on Saturday. The tunnel will remain open only for shows and exhibits.
When Quinones and his wife Fabiola opened Antigua in 2007, they sent a letter to the Department of Transportation about reopening the tunnel. But the couple received only a form letter about their concern. It didn't bother Quinones, whose main focus was opening his coffee house, a former ice cream shop.
He continued to tackle the tunnel project with enthusiasm but most importantly patience. Patience in attempting to contact his local council member, the Department of Water and Power, the City Attorney and the doors of a dozen other agencies he had to knock on. The neighborhood Senior Lead Officer contacted the council member's office on his behalf, but the response Quinones received was that the project was not feasible, that the crime rate was too high.
The response that Quinones received from the city was to speak with a number of different offices.
"They didn't think I would go to everyone, but I did. I went to all the offices, asked all the right questions," Quinones says. "But then a clerk at City Hall told me that I had to get a request from my local city council member. It was like one big circle."
This was early 2010, when nearby Highland Park was beginning to see an influx of new businesses. Meanwhile, Quinones was reshaping his corner at Loreta and Figueroa in Cypress Park with new murals, sidewalk tables and chairs; people were excited to have a coffee shop in the community. The area was changing for the better.
"I've been here for 45 years and I've never seen the area like this before," says Rogelio Fonseca, owner of the restaurant La Abeja just a few blocks north of the tunnel.
"The area is heavy with bike traffic, with new businesses that seem to be giving a lot back to the community," Fonseca adds.
By October 2012 Quinones still did not have a solid answer. He would attend city council meetings or be in the same room with his city council member – "Any word on my tunnel?" he would ask as a joke. Eventually Jose Gardea, chief of staff to the outgoing council member Ed Reyes, came to Antigua and observed the foot traffic and gave Quinones the go ahead.
The Cypress Park Neighborhood Council approved a grant of $9,000 for the project; hence the reason Quinones' arms are in the air as he takes a victory pose in his tunnel.
The tunnel will open on Saturday, May 11 at 6 p.m. with a show of work by by local artist Jose Ramirez, whose band will also be playing in the tunnel. Quinones hopes to see the underground gallery used monthly.
Now Quinones is going to put together a manual on how to repurpose these tunnels, "so that other people can utilize these empty spaces that are not being used."
For now he can rest and get back to making coffee for Cypress Park.
The eastern tunnel entrance getting a new coat of paint/Nathan Solis
Tunnel makeover in progress/Photo by Nathan Solis
Nathan Solis is a Highland Park resident who writes about and photographs the L.A. music scene. You can find more of Solis stories, reviews and photos at Smashed Chair.
Read the Full Story at Eastsider LA


text: 09 Jul 2013 12:00 Etihad Airways, the national airline of the United Arab Emirates, has commenced codeshare services with South African Airways (SAA) following regulatory approval, which enables both carriers to offer codeshare and interline services to key destinations on each others' route networks. Effective immediately, and under the first phase of the codeshare agreement, Etihad Airways passengers can now travel on Etihad Airways' marketed flights from Johannesburg to four major destinations on the SAA network including: Cape Town, Durban, East London and Port Elizabeth. Codesharing on scheduled services to other key destinations, including Livingston, Lusaka, Ndola, Harare, and Victoria Falls is currently pending subject to local government approval. In return, passengers travelling from Africa can now access SAA marketed flights on Etihad Airways scheduled service from Johannesburg to its hub in Abu Dhabi, and onwards across the airline's fast growing global network to Bahrain, Kuwait, Bangkok and Kuala Lumpur. Other major destinations currently pending regulatory approval include Shanghai, Singapore and Jeddah. Kevin Knight, Etihad Airways' Chief Strategy and Planning Officer, said: "Increasing our reach into Southern Africa is critical in meeting the demand from growing numbers of leisure and business passengers travelling between Africa and the major emerging markets in the Middle East, Asia, the Indian subcontinent and Australia. "The partnership agreement with South African Airways reflects our strategy of forming alliances with airlines around the world to enhance the global reach of our network," he said. Manoj Papa, SAA's acting General Manager - Commercial, added: "We are confident that the new codeshare partnership will prove extremely popular with business and leisure travellers who can now take advantage of the greater choice and seamless connectivity across our combined networks and markets." Phase two of a wide ranging Memorandum of Understanding (MoU) signed in May 2013 makes provision for the two airlines to explore areas of further commercial cooperation that provide costs saving and operational efficiencies, which can be achieved through synergies and collaboration across a number of areas including reciprocal Frequent Flyer Programme participation, ground handling, procurement and training. Etihad Airways launched its service between the UAE and South Africa in 2005, and currently operates scheduled services to eight destinations in Africa and the Indian Ocean including: Johannesburg, Khartoum, Casablanca, Cairo, Nairobi, Lagos, Tripoli and Mahé in the Seychelles. Свяжитесь с нами Как и подобает престижной международной авиакомпании, наши представительства размещены по всему миру. Узнайте, как обратиться в ближайший офис Etihad.Подробная контактная информация Ваши отзывы Если вы желаете послать нам комментарий, комплимент, жалобу или задать вопрос, то нажмите сюда Голосуйте за нас значком «Лайк» («Нравится») Заходите на нашу страницу в Facebook! Следите за нашей деятельностью Посетите наш канал на YouTube! Следите за нашей деятельностью Etihad Airways | Выгодные предложения от авиакомпании Etihad | Справочная служба авиакомпании Etihad | Вознаграждения авиакомпании Etihad