1 /*global JXG:true, define: true*/
  2 
  3 import JXG from "./jxg.js";
  4 import Options from "./options.js";
  5 
  6 JXG.extend(Options, {
  7     // infobox: {
  8     //     // strokeColor: 'black',
  9     //     // useKatex: false,
 10     //     // useMathjax: false
 11     // },
 12 
 13     axes3d: {
 14         /**#@+
 15          * @visprop
 16          */
 17 
 18         /**
 19          * Position of the main axes in a View3D element. Possible values are
 20          * 'center', 'border' or 'none'.
 21          *
 22          * @type String
 23          * @name View3D#axesPosition
 24          * @default 'center'
 25          */
 26         axesPosition: "center", // Possible values: 'center', 'border', 'none'
 27 
 28         // Main axes
 29         /**
 30          * Attributes of the centered 3D x-axis.
 31          *
 32          * @type Line3D
 33          * @name View3D#xAxis
 34          * @see View3D#axesPosition
 35          */
 36         xAxis: { visible: true, point2: { name: "x" }, strokeColor: JXG.palette.red },
 37 
 38         /**
 39          * Attributes of the centered 3D y-axis.
 40          *
 41          * @type Line3D
 42          * @name View3D#yAxis
 43          * @see View3D#axesPosition
 44          */
 45         yAxis: { visible: true, point2: { name: "y" }, strokeColor: JXG.palette.green },
 46 
 47         /**
 48          * Attributes of the centered 3D z-axis.
 49          *
 50          * @type Line3D
 51          * @name View3D#zAxis
 52          * @see View3D#axesPosition
 53          */
 54         zAxis: { visible: true, point2: { name: "z" }, strokeColor: JXG.palette.blue },
 55 
 56         /**
 57          * Attributes of the 3D x-axis at the border.
 58          *
 59          * @type Line3D
 60          * @name View3D#xAxisBorder
 61          * @see View3D#axesPosition
 62          * @default <pre>{
 63          *   name: 'x',
 64          *   withLabel: false,
 65          *   label: {
 66          *       position: '50% left',
 67          *       offset: [30, 0],
 68          *       fontsize: 15
 69          *   },
 70          *   strokeWidth: 1,
 71          *   lastArrow: false,
 72          *   ticks3d: {
 73          *       label: {
 74          *           anchorX: 'middle',
 75          *           anchorY: 'middle'
 76          *       }
 77          *   }
 78          *}
 79          *</pre>
 80          */
 81         xAxisBorder: {
 82             name: 'x',
 83             withLabel: false,
 84             label: {
 85                 position: '50% left',
 86                 offset: [30, 0],
 87                 fontsize: 15
 88             },
 89             strokeWidth: 1,
 90             lastArrow: false,
 91             ticks3d: {
 92                 label: {
 93                     anchorX: 'middle',
 94                     anchorY: 'middle'
 95                 }
 96 
 97             }
 98         },
 99 
100         /**
101          * Attributes of the 3D y-axis at the border.
102          *
103          * @type Line3D
104          * @name View3D#yAxisBorder
105          * @see View3D#axesPosition
106          * @default <pre>{
107          *   name: 'x',
108          *   withLabel: false,
109          *   label: {
110          *       position: '50% right',
111          *       offset: [0, -30],
112          *       fontsize: 15
113          *   },
114          *   strokeWidth: 1,
115          *   lastArrow: false,
116          *   ticks3d: {
117          *       label: {
118          *           anchorX: 'middle',
119          *       }
120          *   }
121          *}
122          *</pre>
123          */
124         yAxisBorder: {
125             name: 'y',
126             withLabel: false,
127             label: {
128                 position: '50% right',
129                 offset: [0, -30],
130                 fontsize: 15
131             },
132             strokeWidth: 1,
133             lastArrow: false,
134             ticks3d: {
135                 label: {
136                     anchorX: 'middle'
137                 }
138             }
139         },
140 
141         /**
142          * Attributes of the 3D z-axis at the border.
143          *
144          * @type Line3D
145          * @name View3D#zAxisBorder
146          * @see View3D#axesPosition
147          * @default <pre>{
148          *   name: 'z',
149          *   withLabel: false,
150          *   label: {
151          *       position: '50% right',
152          *       offset: [30, 0],
153          *       fontsize: 15
154          *   },
155          *   strokeWidth: 1,
156          *   lastArrow: false,
157          *   ticks3d: {
158          *       label: {
159          *           anchorX: 'middle',
160          *           anchorY: 'middle'
161          *       }
162          *   }
163          *}
164          *</pre>
165          */
166         zAxisBorder: {
167             name: 'z',
168             withLabel: false,
169             label: {
170                 position: '50% right',
171                 offset: [30, 0],
172                 fontsize: 15
173             },
174             strokeWidth: 1,
175             lastArrow: false,
176             ticks3d: {
177                 label: {
178                     anchorX: 'middle',
179                     anchorY: 'middle'
180                 }
181             }
182         },
183 
184         // Planes
185         /**
186          * Attributes of the 3D plane orthogonal to the x-axis at the "rear" of the cube.
187          * @type Plane3D
188          * @name View3D#xPlaneRear
189          */
190         xPlaneRear: {
191             visible: true,
192             layer: 0,
193             strokeWidth: 1,
194             strokeColor: '#dddddd',
195             fillColor: '#dddddd',
196             mesh3d: { layer: 1 }
197         },
198 
199         /**
200          * Attributes of the 3D plane orthogonal to the y-axis at the "rear" of the cube.
201          * @type Plane3D
202          * @name View3D#yPlaneRear
203          */
204         yPlaneRear: {
205             visible: true,
206             strokeWidth: 1,
207             strokeColor: '#dddddd',
208             fillColor: '#dddddd',
209             layer: 0,
210             mesh3d: { layer: 1 }
211         },
212 
213         /**
214          * Attributes of the 3D plane orthogonal to the z-axis at the "rear" of the cube.
215          * @type Plane3D
216          * @name View3D#zPlaneRear
217          */
218         zPlaneRear: {
219             visible: true,
220             strokeWidth: 1,
221             strokeColor: '#dddddd',
222             fillColor: '#dddddd',
223             layer: 0,
224             mesh3d: { layer: 1 }
225         },
226 
227         /**
228          * Attributes of the 3D plane orthogonal to the x-axis at the "front" of the cube.
229          * @type Plane3D
230          * @name View3D#xPlaneFront
231          */
232         xPlaneFront: {
233             visible: false,
234             strokeWidth: 1,
235             strokeColor: '#dddddd',
236             fillColor: '#dddddd',
237             layer: 0,
238             mesh3d: { layer: 1 }
239         },
240         /**
241          * Attributes of the 3D plane orthogonal to the y-axis at the "front" of the cube.
242          * @type Plane3D
243          * @name View3D#yPlaneFront
244          */
245         yPlaneFront: {
246             visible: false,
247             strokeWidth: 1,
248             strokeColor: '#dddddd',
249             fillColor: '#dddddd',
250             layer: 0,
251             mesh3d: { layer: 1 }
252         },
253         /**
254          * Attributes of the 3D plane orthogonal to the z-axis at the "front" of the cube.
255          * @type Plane3D
256          * @name View3D#zPlaneFront
257          */
258         zPlaneFront: {
259             visible: false,
260             strokeWidth: 1,
261             strokeColor: '#dddddd',
262             fillColor: '#dddddd',
263             layer: 0,
264             mesh3d: { layer: 1 }
265         },
266 
267         // Axes on the planes
268         /**
269          * Attributes of the 3D y-axis on the 3D plane orthogonal to the x-axis at the "rear" of the cube.
270          * @type Plane3D
271          * @name View3D#xPlaneRearYAxis
272          */
273         xPlaneRearYAxis: {
274             visible: "inherit",
275             strokeColor: "#888888",
276             strokeWidth: 1
277         },
278         /**
279          * Attributes of the 3D z-axis on the 3D plane orthogonal to the x-axis at the "rear" of the cube.
280          * @type Plane3D
281          * @name View3D#xPlaneRearZAxis
282          */
283         xPlaneRearZAxis: {
284             visible: "inherit",
285             strokeColor: "#888888",
286             strokeWidth: 1
287         },
288         /**
289          * Attributes of the 3D y-axis on the 3D plane orthogonal to the x-axis at the "front" of the cube.
290          * @type Plane3D
291          * @name View3D#xPlaneFrontYAxis
292          */
293         xPlaneFrontYAxis: {
294             visible: "inherit",
295             strokeColor: "#888888",
296             strokeWidth: 1
297         },
298         /**
299          * Attributes of the 3D z-axis on the 3D plane orthogonal to the x-axis at the "front" of the cube.
300          * @type Plane3D
301          * @name View3D#xPlaneFrontZAxis
302          */
303         xPlaneFrontZAxis: {
304             visible: "inherit",
305             strokeColor: "#888888",
306             strokeWidth: 1
307         },
308 
309         /**
310          * Attributes of the 3D x-axis on the 3D plane orthogonal to the y-axis at the "rear" of the cube.
311          * @type Plane3D
312          * @name View3D#yPlaneRearXAxis
313          */
314         yPlaneRearXAxis: {
315             visible: "inherit",
316             strokeColor: "#888888",
317             strokeWidth: 1
318         },
319         /**
320          * Attributes of the 3D z-axis on the 3D plane orthogonal to the y-axis at the "rear" of the cube.
321          * @type Plane3D
322          * @name View3D#yPlaneRearZAxis
323          */
324         yPlaneRearZAxis: {
325             visible: "inherit",
326             strokeColor: "#888888",
327             strokeWidth: 1
328         },
329         /**
330          * Attributes of the 3D x-axis on the 3D plane orthogonal to the y-axis at the "front" of the cube.
331          * @type Plane3D
332          * @name View3D#yPlaneFrontXAxis
333          */
334         yPlaneFrontXAxis: {
335             visible: "inherit",
336             strokeColor: "#888888",
337             strokeWidth: 1
338         },
339         /**
340          * Attributes of the 3D z-axis on the 3D plane orthogonal to the y-axis at the "front" of the cube.
341          * @type Plane3D
342          * @name View3D#yPlaneFrontZAxis
343          */
344         yPlaneFrontZAxis: {
345             visible: "inherit",
346             strokeColor: "#888888",
347             strokeWidth: 1
348         },
349 
350         /**
351          * Attributes of the 3D x-axis on the 3D plane orthogonal to the z-axis at the "rear" of the cube.
352          * @type Plane3D
353          * @name View3D#zPlaneRearXAxis
354          */
355         zPlaneRearXAxis: {
356             visible: "inherit",
357             strokeColor: "#888888",
358             strokeWidth: 1
359         },
360         /**
361          * Attributes of the 3D y-axis on the 3D plane orthogonal to the z-axis at the "rear" of the cube.
362          * @type Plane3D
363          * @name View3D#zPlaneRearYAxis
364          */
365         zPlaneRearYAxis: {
366             visible: "inherit",
367             strokeColor: "#888888",
368             strokeWidth: 1
369         },
370         /**
371          * Attributes of the 3D x-axis on the 3D plane orthogonal to the z-axis at the "front" of the cube.
372          * @type Plane3D
373          * @name View3D#zPlaneFrontXAxis
374          */
375         zPlaneFrontXAxis: {
376             visible: "inherit",
377             strokeColor: "#888888",
378             strokeWidth: 1
379         },
380         /**
381          * Attributes of the 3D y-axis on the 3D plane orthogonal to the z-axis at the "front" of the cube.
382          * @type Plane3D
383          * @name View3D#zPlaneFrontYAxis
384          */
385         zPlaneFrontYAxis: {
386             visible: "inherit",
387             strokeColor: "#888888",
388             strokeWidth: 1
389         }
390 
391         /**#@-*/
392     },
393 
394     axis3d: {
395         highlight: false,
396         fixed: true,
397         strokecolor: "black",
398         strokeWidth: 1,
399         tabindex: null,
400 
401         point1: { visible: false, name: "" },
402         point2: { visible: false, name: "", label: { visible: true } }
403     },
404 
405     circle3d: {
406 
407         point: { visible: false, name: "" }
408     },
409 
410     curve3d: {
411         /**#@+
412          * @visprop
413          */
414 
415         highlight: false,
416         tabindex: -1,
417         strokeWidth: 1,
418         numberPointsHigh: 200
419 
420         /**#@-*/
421     },
422 
423     intersectionline3d: {
424         point1: { visible: false, name: "" }, // Used in point/point
425         point2: { visible: false, name: "" }
426     },
427 
428     line3d: {
429         strokeWidth: 1,
430         strokeColor: "black",
431         fixed: true,
432         tabindex: null,
433         gradient: "linear",
434         gradientSecondColor: "#ffffff",
435 
436         point: { visible: false, name: "" }, // Used in cases of point/direction/range
437         point1: { visible: false, name: "" }, // Used in point/point
438         point2: { visible: false, name: "" }
439     },
440 
441     mesh3d: {
442         /**#@+
443          * @visprop
444          */
445 
446         strokeWidth: 1,
447         strokeColor: "#9a9a9a",
448         strokeOpacity: 0.6,
449         highlight: false,
450         tabindex: null,
451 
452         visible: "inherit"
453 
454         /**#@-*/
455     },
456 
457     plane3d: {
458         strokeWidth: 0,
459         strokeColor: "black",
460         strokeOpacity: 1,
461         highlight: false,
462         tabindex: null,
463 
464         gradient: "linear",
465         gradientSecondColor: "#ffffff",
466         gradientAngle: Math.PI,
467         fillColor: "#a7a7a7",
468         fillOpacity: 0.6,
469 
470         point: { visible: false, name: "", fixed: true }
471     },
472 
473     point3d: {
474         infoboxDigits: "auto",
475         strokeWidth: 0,
476         gradient: "radial",
477         gradientSecondColor: "#555555",
478         fillColor: "yellow",
479         highlightStrokeColor: "#555555",
480         gradientFX: 0.7,
481         gradientFY: 0.3
482     },
483 
484     polygon3d: {
485         /**#@+
486          * @visprop
487          */
488 
489         highlight: false,
490         tabindex: -1,
491         strokeWidth: 1,
492         fillColor: 'none'
493 
494         /**#@-*/
495     },
496 
497     sphere3d: {
498         /**#@+
499          * @visprop
500          */
501 
502         highlight: false,
503 
504         strokeWidth: 1,
505         strokeColor: '#00ff80',
506         fillColor: 'white',
507         gradient: 'radial',
508         gradientSecondColor: '#00ff80',
509         gradientFX: 0.7,
510         gradientFY: 0.3,
511         fillOpacity: 0.4
512 
513         /**#@-*/
514     },
515 
516     surface3d: {
517         /**#@+
518          * @visprop
519          */
520 
521         highlight: false,
522         tabindex: -1,
523         strokeWidth: 1,
524 
525         /**
526          * Number of intervals the mesh is divided into in direction of parameter u.
527          * @type Number
528          * @name ParametricSurface3D#stepsU
529          */
530         stepsU: 30,
531 
532         /**
533          * Number of intervals the mesh is divided into in direction of parameter v.
534          * @type Number
535          * @name ParametricSurface3D#stepsV
536          */
537         stepsV: 30
538 
539         /**#@-*/
540     },
541 
542     text3d: {
543         /**#@+
544          * @visprop
545          */
546 
547         /**#@-*/
548     },
549 
550     ticks3d: {
551         /**#@+
552          * @visprop
553          */
554 
555         visible: true,
556 
557         ticksDistance: 1,
558         majorHeight: 10,
559         minorTicks: 0,
560         tickEndings: [0, 1],
561         drawLabels: true,
562 
563         label: {
564             visible: true
565         }
566 
567         /**#@-*/
568     },
569 
570     vectorfield3d: {
571         /**#@+
572          * @visprop
573          */
574 
575         /**
576          * Scaling factor of the vectors. This in contrast to slope fields, where this attribute sets the vector to the given length.
577          * @name scale
578          * @memberOf Vectorfield3D.prototype
579          * @type {Number|Function}
580          * @see Slopefield.scale
581          * @default 1
582          */
583         scale: 1,
584 
585         /**
586          * Customize arrow heads of vectors. Be careful! If enabled this will slow down the performance.
587          * Fields are:
588          * <ul>
589          *  <li> enabled: Boolean
590          *  <li> size: length of the arrow head legs (in pixel)
591          *  <li> angle: angle of the arrow head legs In radians.
592          * </ul>
593          * @name arrowhead
594          * @memberOf Vectorfield3D.prototype
595          * @type {Object}
596          * @default <tt>{enabled: true, size: 5, angle: Math.PI * 0.125}</tt>
597          */
598         arrowhead: {
599             enabled: true,
600             size: 5,
601             angle: Math.PI * 0.125
602         }
603 
604         /**#@-*/
605     },
606 
607     view3d: {
608         /**#@+
609          * @visprop
610          */
611 
612         needsRegularUpdate: true,
613 
614         /**
615          * Choose the projection type to be used: `parallel` or `central`.
616          * <ul>
617          * <li> `parallel` is parallel projection, also called orthographic projection
618          * <li> `central` is central projection, also called perspective projection
619          * </ul>
620          *
621          *
622          * @name View3D#projection
623          * @type String
624          * @default 'parallel'
625          */
626         projection: 'parallel',
627 
628         /**
629          * Allow vertical dragging of objects, i.e. in direction of the z-axis.
630          * Subobjects are
631          * <ul>
632          *  <li>enabled: true
633          *  <li>key: 'shift'
634          * </ul>
635          * <p>
636          * Possible values for attribute <i>key</i>: 'shift' or 'ctrl'.
637          *
638          * @name View3D#verticalDrag
639          * @type Object
640          * @default <tt>{enabled: true, key: 'shift'}</tt>
641          */
642         verticalDrag: {
643             enabled: true,
644             key: 'shift'
645         },
646 
647         /**
648          * Specify the user handling of the azimuth.
649          * <ul>
650          *  <li><tt>pointer</tt> sub-attributes:
651          *      <ul>
652          *          <li><tt>enabled</tt>: Boolean that specifies whether pointer navigation is allowed by azimuth.
653          *          <li><tt>speed</tt>: Number indicating how many passes the range of the az_slider makes when the cursor crosses the entire board once in the horizontal direction.
654          *          <li><tt>outside</tt>: Boolean that specifies whether the pointer navigation is continued when the cursor leaves the board.
655          *          <li><tt>button</tt>: Which button of the pointer should be used? (<tt>'-1'</tt> (=no button), <tt>'0'</tt> or <tt>'2'</tt>)
656          *          <li><tt>key</tt>: Should an additional key be pressed? (<tt>'none'</tt>, <tt>'shift'</tt> or <tt>'ctrl'</tt>)
657          *      </ul>
658          *  <li><tt>keyboard</tt> sub-attributes:
659          *      <ul>
660          *          <li><tt>enabled</tt>: Boolean that specifies whether the keyboard (arrow keys) can be used to navigate the board.
661          *          <li><tt>step</tt>: Size of the step per keystroke.
662          *          <li><tt>key</tt>: Should an additional key be pressed? (<tt>'none'</tt>, <tt>'shift'</tt> or <tt>'ctrl'</tt>)
663          *      </ul>
664          *  <li><tt>continuous</tt>: Boolean that specifies whether the az_slider starts again from the beginning when its end is reached.
665          *  <li><tt>slider</tt> attributes of the az_slider ({@link Slider}) with additional
666          *      <ul>
667          *          <li><tt>min</tt>: Minimum value.
668          *          <li><tt>max</tt>: Maximum value.
669          *          <li><tt>start</tt>: Start value.
670          *      </ul>
671          * </ul>
672          *
673          * @name View3D#az
674          * @type Object
675          * @default <pre>{
676          *      pointer: {enabled: true, speed: 1, outside: true, button: -1, key: 'none'},
677          *      keyboard: {enabled: true, step: 10, key: 'ctrl'},
678          *      continuous: true,
679          *      slider: {
680          *          visible: true,
681          *          style: 6,
682          *          point1: {frozen: true},
683          *          point2: {frozen: true},
684          *          min: 0,
685          *          max: 2 * Math.PI,
686          *          start: 1.0
687          *      },
688          * }</pre>
689          * @example
690          *     var bound = [-4, 6];
691          *     var view = board.create('view3d',
692          *         [[-4, -3], [8, 8],
693          *         [bound, bound, bound]],
694          *         {
695          *             projection: 'parallel',
696          *             az: {
697          *                 slider: {visible: true}
698          *             }
699          *         });
700          *
701          * </pre><div id="JXG4c381f21-f043-4419-941d-75f384c026d0" class="jxgbox" style="width: 300px; height: 300px;"></div>
702          * <script type="text/javascript">
703          *     (function() {
704          *         var board = JXG.JSXGraph.initBoard('JXG4c381f21-f043-4419-941d-75f384c026d0',
705          *             {boundingbox: [-8, 8, 8,-8], axis: false, showcopyright: false, shownavigation: false});
706          *         var bound = [-4, 6];
707          *         var view = board.create('view3d',
708          *             [[-4, -3], [8, 8],
709          *             [bound, bound, bound]],
710          *             {
711          *                 projection: 'parallel',
712          *                 az: {
713          *                     slider: {visible: true}
714          *                 }
715          *             });
716          *
717          *     })();
718          *
719          * </script><pre>
720          *
721          */
722         az: {
723             pointer: {
724                 enabled: true,
725                 speed: 1,
726                 outside: true,
727                 button: -1,
728                 key: 'none'
729             },
730             keyboard: {
731                 enabled: true,
732                 step: 10,
733                 key: 'ctrl'
734             },
735             continuous: true,
736             slider: {
737                 visible: 'inherit',
738                 style: 6,
739                 point1: { frozen: true },
740                 point2: { frozen: true },
741                 min: 0,
742                 max: 2 * Math.PI,
743                 start: 1.0
744             }
745         },
746 
747         /**
748          * Specify the user handling of the elevation.
749          * <ul>
750          *  <li><tt>pointer</tt> sub-attributes:
751          *      <ul>
752          *          <li><tt>enabled</tt>: Boolean that specifies whether pointer navigation is allowed by elevation.
753          *          <li><tt>speed</tt>: Number indicating how many passes the range of the el_slider makes when the cursor crosses the entire board once in the horizontal direction.
754          *          <li><tt>outside</tt>: Boolean that specifies whether the pointer navigation is continued when the cursor leaves the board.
755          *          <li><tt>button</tt>: Which button of the pointer should be used? (<tt>'-1'</tt> (=no button), <tt>'0'</tt> or <tt>'2'</tt>)
756          *          <li><tt>key</tt>: Should an additional key be pressed? (<tt>'none'</tt>, <tt>'shift'</tt> or <tt>'ctrl'</tt>)
757          *      </ul>
758          *  <li><tt>keyboard</tt> sub-attributes:
759          *      <ul>
760          *          <li><tt>enabled</tt>: Boolean that specifies whether the keyboard (arrow keys) can be used to navigate the board.
761          *          <li><tt>step</tt>: Size of the step per keystroke.
762          *          <li><tt>key</tt>: Should an additional key be pressed? (<tt>'none'</tt>, <tt>'shift'</tt> or <tt>'ctrl'</tt>)
763          *      </ul>
764          *  <li><tt>continuous</tt>: Boolean that specifies whether the el_slider starts again from the beginning when its end is reached.
765          *  <li><tt>slider</tt> attributes of the el_slider ({@link Slider}) with additional
766          *      <ul>
767          *          <li><tt>min</tt>: Minimum value.
768          *          <li><tt>max</tt>: Maximum value.
769          *          <li><tt>start</tt>: Start value.
770          *      </ul>
771          * </ul>
772          *
773          * @name View3D#el
774          * @type Object
775          * @default <pre>{
776          *      pointer: {enabled: true, speed: 1, outside: true, button: -1, key: 'none'},
777          *      keyboard: {enabled: true, step: 10, key: 'ctrl'},
778          *      continuous: true,
779          *      slider: {
780          *          visible: true,
781          *          style: 6,
782          *          point1: {frozen: true},
783          *          point2: {frozen: true},
784          *          min: 0,
785          *          max: 2 * Math.PI,
786          *          start: 0.3
787          *      },
788          * }<pre>
789          * @example
790          *     var bound = [-4, 6];
791          *     var view = board.create('view3d',
792          *         [[-4, -3], [8, 8],
793          *         [bound, bound, bound]],
794          *         {
795          *             projection: 'parallel',
796          *             el: {
797          *                 slider: {visible: true}
798          *             }
799          *         });
800          *
801          * </pre><div id="JXG8926f733-c42e-466b-853c-74feb795e879" class="jxgbox" style="width: 300px; height: 300px;"></div>
802          * <script type="text/javascript">
803          *     (function() {
804          *         var board = JXG.JSXGraph.initBoard('JXG8926f733-c42e-466b-853c-74feb795e879',
805          *             {boundingbox: [-8, 8, 8,-8], axis: false, showcopyright: false, shownavigation: false});
806          *         var bound = [-4, 6];
807          *         var view = board.create('view3d',
808          *             [[-4, -3], [8, 8],
809          *             [bound, bound, bound]],
810          *             {
811          *                 projection: 'parallel',
812          *                 el: {
813          *                     slider: {visible: true}
814          *                 }
815          *             });
816          *
817          *     })();
818          *
819          * </script><pre>
820          *
821          */
822         el: {
823             pointer: {
824                 enabled: true,
825                 speed: 1,
826                 outside: true,
827                 button: -1,
828                 key: 'none'
829             },
830             keyboard: {
831                 enabled: true,
832                 step: 10,
833                 key: 'ctrl'
834             },
835             continuous: true,
836             slider: {
837                 visible: 'inherit',
838                 style: 6,
839                 point1: { frozen: true },
840                 point2: { frozen: true },
841                 min: 0,
842                 max: 2 * Math.PI,
843                 start: 0.3
844             }
845         },
846 
847         /**
848          * Specify the user handling of the bank angle.
849          * <ul>
850          *  <li><tt>pointer</tt> sub-attributes:
851          *      <ul>
852          *          <li><tt>enabled</tt>: Boolean that specifies whether pointer navigation is allowed by elevation.
853          *          <li><tt>speed</tt>: Number indicating how many passes the range of the el_slider makes when the cursor crosses the entire board once in the horizontal direction.
854          *          <li><tt>outside</tt>: Boolean that specifies whether the pointer navigation is continued when the cursor leaves the board.
855          *          <li><tt>button</tt>: Which button of the pointer should be used? (<tt>'-1'</tt> (=no button), <tt>'0'</tt> or <tt>'2'</tt>)
856          *          <li><tt>key</tt>: Should an additional key be pressed? (<tt>'none'</tt>, <tt>'shift'</tt> or <tt>'ctrl'</tt>)
857          *      </ul>
858          *  <li><tt>keyboard</tt> sub-attributes:
859          *      <ul>
860          *          <li><tt>enabled</tt>: Boolean that specifies whether the keyboard (arrow keys) can be used to navigate the board.
861          *          <li><tt>step</tt>: Size of the step per keystroke.
862          *          <li><tt>key</tt>: Should an additional key be pressed? (<tt>'none'</tt>, <tt>'shift'</tt> or <tt>'ctrl'</tt>)
863          *      </ul>
864          *  <li><tt>continuous</tt>: Boolean that specifies whether the el_slider starts again from the beginning when its end is reached.
865          *  <li><tt>slider</tt> attributes of the el_slider ({@link Slider}) with additional
866          *      <ul>
867          *          <li><tt>min</tt>: Minimum value.
868          *          <li><tt>max</tt>: Maximum value.
869          *          <li><tt>start</tt>: Start value.
870          *      </ul>
871          * </ul>
872          *
873          * @name View3D#bank
874          * @type Object
875          * @default <pre>{
876          *      pointer: {enabled: true, speed: 1, outside: true, button: -1, key: 'none'},
877          *      keyboard: {enabled: true, step: 10, key: 'ctrl'},
878          *      continuous: true,
879          *      slider: {
880          *          visible: true,
881          *          style: 6,
882          *          point1: {frozen: true},
883          *          point2: {frozen: true},
884          *          min: 0,
885          *          max: 2 * Math.PI,
886          *          start: 0.3
887          *      },
888          * }<pre>
889          * @example
890          *     var bound = [-4, 6];
891          *     var view = board.create('view3d',
892          *         [[-4, -3], [8, 8],
893          *         [bound, bound, bound]],
894          *         {
895          *             projection: 'parallel',
896          *             bank: {
897          *                 slider: {visible: true}
898          *             }
899          *         });
900          *
901          * </pre><div id="JXGb67811ea-c1e3-4d1e-b13c-3537b3436f6c" class="jxgbox" style="width: 300px; height: 300px;"></div>
902          * <script type="text/javascript">
903          *     (function() {
904          *         var board = JXG.JSXGraph.initBoard('JXGb67811ea-c1e3-4d1e-b13c-3537b3436f6c',
905          *             {boundingbox: [-8, 8, 8,-8], axis: true, showcopyright: false, shownavigation: false});
906          *         var bound = [-4, 6];
907          *         var view = board.create('view3d',
908          *             [[-4, -3], [8, 8],
909          *             [bound, bound, bound]],
910          *             {
911          *                 projection: 'parallel',
912          *                 bank: {
913          *                     slider: {visible: true}
914          *                 }
915          *             });
916          *
917          *     })();
918          *
919          * </script><pre>
920          *
921          */
922         bank: {
923             pointer: {
924                 enabled: true,
925                 speed: 0.08,
926                 outside: true,
927                 button: -1,
928                 key: 'none'
929             },
930             keyboard: {
931                 enabled: true,
932                 step: 10,
933                 key: 'ctrl'
934             },
935             continuous: true,
936             slider: {
937                 visible: 'inherit',
938                 style: 6,
939                 point1: { frozen: true },
940                 point2: { frozen: true },
941                 min: -Math.PI,
942                 max:  Math.PI,
943                 start: 0.0
944             }
945         },
946 
947         /**
948          * Enable user handling by a virtual trackball.
949          * Sub-attributes:
950          *      <ul>
951          *          <li><tt>enabled</tt>: Boolean that specifies whether pointer navigation is allowed by elevation.
952          *          <li><tt>outside</tt>: Boolean that specifies whether the pointer navigation is continued when the cursor leaves the board.
953          *          <li><tt>button</tt>: Which button of the pointer should be used? (<tt>'-1'</tt> (=no button), <tt>'0'</tt> or <tt>'2'</tt>)
954          *          <li><tt>key</tt>: Should an additional key be pressed? (<tt>'none'</tt>, <tt>'shift'</tt> or <tt>'ctrl'</tt>)
955          *      </ul>
956          *
957          * @name View3D#trackball
958          * @type Object
959          * @default <pre>{
960          *   enabled: false,
961          *   outside: true,
962          *   button: -1,
963          *   key: 'none'
964          * }
965          * </pre>
966          */
967         trackball: {
968             enabled: false,
969             outside: true,
970             button: -1,
971             key: 'none'
972         },
973 
974         /**
975          * Distance of the camera to the center of the view.
976          * If set to 'auto', r will be calculated automatically.
977          *
978          * @type {Number|String}
979          * @default 'auto'
980          */
981         r: 'auto',
982 
983         /**
984          * Field of View defines the angle of view (in radians) of the camera, determining how much of the scene is captured within the frame.
985          *
986          * @type Number
987          * @default 2/5*Math.PI
988          */
989         fov: 1 / 5 * 2 * Math.PI,
990 
991         /**
992          * When this option is enabled, points closer to the screen are drawn
993          * over points further from the screen within each layer.
994          *
995          * @name View3D#depthOrderPoints
996          * @default false
997          */
998         depthOrderPoints: false,
999 
1000         /**
1001          * Fixed values for the view, which can be changed using keyboard keys `picture-up` and `picture-down`.
1002          * Array of the form: [[el0, az0, r0], [el1, az1, r1, ...[eln, azn, rn]]
1003          *
1004          * @name View3D#values
1005          * @type Array
1006          * @default <tt>{[[0, 1.57], [0.78, 0.62], [0, 0], [5.49, 0.62], [4.71, 0], [3.93, 0.62], [3.14, 0], [2.36, 0.62], [1.57, 1.57]]}<tt>
1007          */
1008         values: [
1009             [0, 1.57],
1010             [0.78, 0.62],
1011             [0, 0],
1012             [5.49, 0.62],
1013             [4.71, 0],
1014             [3.93, 0.62],
1015             [3.14, 0],
1016             [2.36, 0.62],
1017             [1.57, 1.57]
1018         ],
1019 
1020         infobox: {
1021             strokeColor: '#888888',
1022             useKatex: false,
1023             useMathjax: false
1024         },
1025 
1026         /**
1027          * @class
1028          * @ignore
1029          */
1030         _currentView: -1
1031 
1032         /**#@-*/
1033     }
1034 });
1035 
1036 export default JXG.Options;
1037