1 /*
  2     Copyright 2008,2009
  3         Matthias Ehmann,
  4         Michael Gerhaeuser,
  5         Carsten Miller,
  6         Bianca Valentin,
  7         Alfred Wassermann,
  8         Peter Wilfahrt
  9 
 10     This file is part of JSXGraph.
 11 
 12     JSXGraph is free software: you can redistribute it and/or modify
 13     it under the terms of the GNU Lesser General Public License as published by
 14     the Free Software Foundation, either version 3 of the License, or
 15     (at your option) any later version.
 16 
 17     JSXGraph is distributed in the hope that it will be useful,
 18     but WITHOUT ANY WARRANTY; without even the implied warranty of
 19     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 20     GNU Lesser General Public License for more details.
 21 
 22     You should have received a copy of the GNU Lesser General Public License
 23     along with JSXGraph.  If not, see <http://www.gnu.org/licenses/>.
 24 */
 25 
 26 JXG.extend(JXG.Board.prototype, /** @lends JXG.Board.prototype */ {
 27     angle: function(A, B, C){ return JXG.Math.Geometry.angle(A,B,C); },
 28     rad: function(A, B, C){ return JXG.Math.Geometry.rad(A,B,C); },
 29     distance: function(arr1, arr2){ return JXG.Math.Geometry.distance(arr1,arr2); },
 30     pow: function(a, b){ return JXG.Math.pow(a,b); },
 31     round: function(x, n){ return (x).toFixed(n); },
 32     cosh: function(x){ return JXG.Math.cosh(x); },
 33     sinh: function(x){ return JXG.Math.sinh(x); },
 34     sgn: function(x) { return (x==0 ? 0 : x/(Math.abs(x))); },
 35     D: function(f,obj){ return JXG.Math.Numerics.D(f,obj); },
 36     I: function(interval,f){ return JXG.Math.Numerics.I(interval,f); },
 37     root: function(f,x,obj){ return JXG.Math.Numerics.root(f,x,obj); },
 38     lagrangePolynomial: function(p){ return JXG.Math.Numerics.lagrangePolynomial(p); },
 39     neville: function(p){ return JXG.Math.Numerics.Neville(p); },
 40     riemannsum: function(f,n,type,start,end){ return JXG.Math.Numerics.riemannsum(f,n,type,start,end); },
 41 
 42     abs: Math.abs,
 43     acos: Math.acos,
 44     asin: Math.asin,
 45     atan: Math.atan,
 46     ceil: Math.ceil,
 47     cos: Math.cos,
 48     exp: Math.exp,
 49     floor: Math.floor,
 50     log: Math.log,
 51     max: Math.max,
 52     min: Math.min,
 53     random: Math.random,
 54     sin: Math.sin,
 55     sqrt: Math.sqrt,
 56     tan: Math.tan,
 57     trunc: Math.ceil,
 58     
 59     factorial: function(n){ return JXG.Math.factorial(n); },
 60     binomial: function(n,k){ return JXG.Math.binomial(n,k); },
 61 
 62     getElement: function (el) {return JXG.getReference(this,el); },
 63 
 64     /**
 65      * GUI interface
 66      **/
 67     intersectionOptions: ['point',[[JXG.OBJECT_CLASS_LINE,JXG.OBJECT_CLASS_LINE],[JXG.OBJECT_CLASS_LINE,JXG.OBJECT_CLASS_CIRCLE],
 68                                    [JXG.OBJECT_CLASS_CIRCLE,JXG.OBJECT_CLASS_CIRCLE]]],
 69     intersection: function(el1,el2,i,j){ 
 70         el1 = JXG.getReference(this,el1);
 71         el2 = JXG.getReference(this,el2);
 72         // curve - curve
 73         if (el1.elementClass==JXG.OBJECT_CLASS_CURVE && 
 74             el2.elementClass==JXG.OBJECT_CLASS_CURVE) {
 75             return function(){return JXG.Math.Geometry.meetCurveCurve(el1,el2,i,j,el1.board); };
 76         // arc - line   (arcs are of class curve, but are intersected like circles)
 77         } else if ((el1.type==JXG.OBJECT_TYPE_ARC && el2.elementClass==JXG.OBJECT_CLASS_LINE) ||
 78                    (el2.type==JXG.OBJECT_TYPE_ARC && el1.elementClass==JXG.OBJECT_CLASS_LINE)) {
 79             return function(){return JXG.Math.Geometry.meet(el1.stdform,el2.stdform,i,el1.board); };
 80         // curve - line (this includes intersections between conic sections and lines
 81         } else if ((el1.elementClass==JXG.OBJECT_CLASS_CURVE && el2.elementClass==JXG.OBJECT_CLASS_LINE)||
 82                    (el2.elementClass==JXG.OBJECT_CLASS_CURVE && el1.elementClass==JXG.OBJECT_CLASS_LINE)) {
 83             return function(){return JXG.Math.Geometry.meetCurveLine(el1,el2,i,el1.board); };
 84         // All other combinations of circles and lines
 85         } else {
 86             return function(){return JXG.Math.Geometry.meet(el1.stdform,el2.stdform,i,el1.board); };
 87         }
 88     }, //returns a single point of intersection
 89     intersectionFunc: function(el1,el2,i,j){ return this.intersection(el1,el2,i,j); },
 90 
 91     /**
 92     * Intersectionof  circles and line
 93     */ 
 94     otherIntersection: function(el1,el2,el){ 
 95         el1 = JXG.getReference(this,el1);
 96         el2 = JXG.getReference(this,el2);
 97         return function(){
 98             var c = JXG.Math.Geometry.meet(el1.stdform,el2.stdform,0,el1.board);
 99             if (Math.abs(el.X()-c.usrCoords[1])>JXG.Math.eps ||
100                 Math.abs(el.Y()-c.usrCoords[2])>JXG.Math.eps ||
101                 Math.abs(el.Z()-c.usrCoords[0])>JXG.Math.eps) {
102                 return c;
103             } else {
104                 return JXG.Math.Geometry.meet(el1.stdform,el2.stdform,1,el1.board);
105             }
106         };
107     }, //returns a single point of intersection
108 
109 
110     pointFunc: function(){return [null];},
111     pointOptions: ['point',[[JXG.OBJECT_CLASS_POINT]]],
112 
113     lineFunc: function(){return arguments;},
114     lineOptions: ['line',[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT]]],
115 
116     linesegmentFunc: function(){return arguments;},
117     linesegmentOptions: ['line',[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT]]],
118     linesegmentAtts: {straightFirst : false, straightLast : false },
119 
120     arrowFunc: function(){return arguments;},
121     arrowOptions: ['arrow',[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT]]],
122 
123     circleFunc: function(){return arguments;},
124     circleOptions: ['circle',[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT],[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_LINE],
125                               [JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_CIRCLE]]],
126 
127     arrowparallelOptions: ['arrowparallel',[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_LINE]]],
128     arrowparallelFunc: function(){return arguments;},
129 
130     bisectorOptions: ['bisector',[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT]]],
131     bisectorFunc: function(){return arguments;},
132 
133     circumcircleOptions: ['circumcircle',[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT]]],
134     circumcircleFunc: function(){return arguments;},
135 
136     circumcirclemidpointOptions: ['circumcirclemidpoint',[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT]]],
137     circumcirclemidpointFunc: function(){return arguments;},
138 
139     integralOptions: ['integral',[[]]],
140     integralFunc: function(){return arguments;},
141 
142     midpointOptions: ['midpoint',[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT],[JXG.OBJECT_CLASS_LINE]]],
143     midpointFunc: function(){return arguments;},
144 
145     mirrorpointOptions: ['mirrorpoint',[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT]]],
146     mirrorpointFunc: function(){return arguments;},
147 
148     normalOptions: ['normal',[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_LINE]]],
149     normalFunc: function(){return arguments;},
150 
151     parallelOptions: ['parallel',[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_LINE]]],
152     parallelFunc: function(){return arguments;},
153 
154     parallelpointOptions: ['parallelpoint',[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_POINT]]],
155     parallelpointFunc: function(){return arguments;},
156 
157     perpendicularOptions: ['perpendicular',[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_LINE]]],
158     perpendicularFunc: function(){return arguments;},
159 
160     perpendicularpointOptions: ['perpendicularpoint',[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_LINE]]],
161     perpendicularpointFunc: function(){return arguments;},
162 
163     reflectionOptions: ['reflection',[[JXG.OBJECT_CLASS_POINT,JXG.OBJECT_CLASS_LINE]]],
164     reflectionFunc: function(){return arguments;}
165 });
166 
167 // Some shortcuts
168 JXG.Point.prototype.setPositionX = function (method, x) {
169     var y = (method==JXG.COORDS_BY_USER)?this.coords.usrCoords[2]:this.coords.scrCoords[2];
170     this.setPosition(method,x,y);
171 };
172 JXG.Point.prototype.setPositionY = function (method, y) {
173     var x = (method==JXG.COORDS_BY_USER)?this.coords.usrCoords[1]:this.coords.scrCoords[1];
174     this.setPosition(method,x,y);
175 };
176