1 /*
  2  * returns the bounding box of a point array.
  3  * 
  4  * @ array 
  5  */
  6 function boundingBoxUsr(points){
  7 	var minX = +Infinity, maxX = -Infinity, minY = +Infinity, maxY = -Infinity;
  8 	for (var i = 0; i < points.length; i++){
  9 		if (points[i][0] < minX)
 10 			minX = points[i][0];
 11 		if (points[i][0] > maxX)
 12 			maxX = points[i][0];
 13 		if (points[i][1] < minY)
 14 			minY = points[i][1];
 15 		if (points[i][1] > maxY)
 16 			maxY = points[i][1];
 17 	}
 18 	return new Array(minX, minY, maxX, maxY);
 19 	 
 20 }
 21 /*
 22  * Find points in the points array, touching the bounding box
 23  * 
 24  * @ array
 25  */	
 26 function pointsOnBoundingBox(points, boundingBox){
 27 	var pointsOnBoundingBox = new Array(-Infinity,-Infinity,-Infinity,-Infinity);
 28 	for (var i=0;i<points.length;i++){
 29 		if (points[i][1]==boundingBox[1])
 30 			pointsOnBoundingBox[0]=points[i];
 31 		if (points[i][1]==boundingBox[3])
 32 			pointsOnBoundingBox[2]=points[i];
 33 		if (points[i][0]==boundingBox[0])
 34 			pointsOnBoundingBox[3]=points[i];
 35 		if (points[i][0]==boundingBox[2])
 36 			pointsOnBoundingBox[1]=points[i];		
 37 	}
 38 	return pointsOnBoundingBox;
 39 }
 40 
 41 /*
 42  * Removes a polygon together with its borders
 43  */
 44 function removePolygon(poly, board){
 45 	for (var i=0; i<poly.borders.length;i++)
 46 		board.removeObject(poly.borders[i]);
 47 	board.removeObject(poly);
 48 }
 49 
 50 /*
 51  * Removes points included in v array but not vertices of polygon poly from board 
 52  */
 53 function removePoint(poly,v,board){
 54 	for (var i = 0;i<v.length;i++){
 55 		var remove = true;
 56 		for (var j = 0;j<poly.vertices.length;j++){
 57 			if (poly.vertices[j]==v[i]){
 58 				remove = false;
 59 				break;
 60 			}
 61 		}
 62 		if (remove){
 63 			board.removeObject(v[i]);
 64 			return;
 65 		}
 66 	}	
 67 }
 68 
 69 /*
 70  * Finds existing points on a circle with midpoint (xm,ym) and radius r within sensititve_area
 71  * @ array
 72  */
 73 function pointsOnCircle(xm, ym, r, sensitive_area, board){
 74 	board.suspendUpdate();
 75 	var m = board.create('point',[xm,ym]);
 76 	var elList = [];
 77 	for (var el in board.objects) {
 78 		if (board.objects[el].visProp['visible'] && board.objects[el].elementClass==JXG.OBJECT_CLASS_POINT && board.objects[el].Dist(m)>=r-sensitive_area && board.objects[el].Dist(m)<=r+sensitive_area) {
 79 			elList.push(board.objects[el]);
 80 		}
 81 	}
 82 	board.unsuspendUpdate();
 83 	return elList;
 84 }
 85 /*
 86  * Finds exitins points within the sensitive area of a given curve
 87  * @ array
 88  */
 89 function pointsOnCurve(curve, sensitive_area, board){
 90 	var elList = [];
 91 	var hasPoint = board.options.precision.hasPoint;
 92 	board.options.precision.hasPoint=sensitive_area*3;
 93 	for (var el in board.objects) {
 94 		if (board.objects[el].visProp['visible'] && board.objects[el].elementClass==JXG.OBJECT_CLASS_POINT){
 95 			var coords = new JXG.Coords(JXG.COORDS_BY_USER,[board.objects[el].X(),board.objects[el].Y()],board);
 96 			var hp = curve.hasPoint(coords.scrCoords[1],coords.scrCoords[2]);
 97 			if (curve.hasPoint(coords.scrCoords[1],coords.scrCoords[2]))
 98 				elList.push(board.objects[el]); 
 99 		}
100 	}
101 	board.options.precision.hasPoint = hasPoint;	
102 	return elList;
103 }
104 /*
105  * Fits data points (2 dim array (x,y) in user coords) to given reference Points, if they are within the sensitve_area
106  */
107 function fitPoints(data,reference,sensitive_area,board){
108 	sensitive_area = 3*sensitive_area /(board.unitX*board.zoomX)
109 	for (var i=0;i<data.length;i++){
110 		var min = Infinity;
111 		var replace;
112 		for (var j=0;j<reference.length;j++){
113 			var dist2 = (data[i][0]-reference[j].X())*(data[i][0]-reference[j].X())+(data[i][1]-reference[j].Y())*(data[i][1]-reference[j].Y());
114 			if (dist2 < min){
115 				min = dist2;
116 				replace = reference[j];
117 			}
118 		}
119 		if (min<sensitive_area*sensitive_area){
120 			data[i]=replace;
121 		}
122 	}
123 	return data;
124 }
125 /*
126  * Fits vertices of a polygon to given reference Points, if they are within the sensitive_area
127  */
128 function fitPoly(poly,reference,sensitive_area,board){
129 	sensitive_area = 3 * sensitive_area /(board.unitX*board.zoomX);
130 	for (var i=0;i<poly.vertices.length;i++){
131 		var min = Infinity;
132 		var replace;
133 		for (var j=0;j<reference.length;j++){
134 			var namei = poly.vertices[i].name;
135 			var namej = reference[j].name;
136 			var dist2 = (poly.vertices[i].X()-reference[j].X())*(poly.vertices[i].X()-reference[j].X())+(poly.vertices[i].Y()-reference[j].Y())*(poly.vertices[i].Y()-reference[j].Y());
137 			if (dist2 == 0)
138 				break;
139 			if (dist2 < min){
140 				min = dist2;
141 				replace = reference[j];
142 			}
143 		}
144 		document.getElementById('debug').innerHTML = min;
145 		if (min<sensitive_area*sensitive_area && min > 0){
146 			var remove = poly.vertices[i];
147 			poly.vertices[i]=replace;
148 
149 			if (!isElementIn(remove, reference))
150 				board.removeObject(remove);
151 
152 			remove = poly;
153 			poly = board.create('polygon',poly.vertices);
154 			board.removeObject(remove);
155 		}
156 	}
157 }
158 
159 /*
160 *	Function which finds obj ín board hitted by coords
161 *
162 * 	@array
163 */
164 function findHittedObj(coords,board, sensitive_area)
165 {
166 	var els = [];
167 	var hasPoint = board.options.precision.hasPoint;
168 	board.options.precision.hasPoint=sensitive_area*2;
169 	for (var el in board.objects)
170 		if (board.objects[el].hasPoint
171             && board.objects[el].visProp['visible']
172             && (board.objects[el].elementClass ==JXG.OBJECT_CLASS_LINE 
173                    || board.objects[el].elementClass ==JXG.OBJECT_CLASS_CIRCLE)
174             ) {
175             if (board.objects[el].hasPoint(coords.scrCoords[1], coords.scrCoords[2])) {
176                 els.push(board.objects[el]);
177             }
178 		}
179 	board.options.precision.hasPoint = hasPoint;
180 	return els;		
181 }
182 
183 
184 /*
185  * Checks if el is included in an array of elements
186  */
187 function isElementIn(el,elements){
188 	for (var i=0;i<elements.length;i++){
189 		if (el == elements[i])
190 			return true;
191     }
192 	return false;
193 }
194 /*
195  * Find existing points in reference (array) next to coords (x,y) (+- sensitive_area)
196  */
197 function findPointNextTo(coords, reference, sensitive_area, board){
198 	sensitive_area = 3 * sensitive_area /(board.unitX*board.zoomX);
199 	var min = Infinity;
200 	var point = null;
201 	for (var i=0; i<reference.length; i++){
202 		var dist2 = (coords[0]-reference[i].X())*(coords[0]-reference[i].X())+(coords[1]-reference[i].Y())*(coords[1]-reference[i].Y());
203 		if (dist2 < min && dist2 <= sensitive_area*sensitive_area){
204 			min = dist2;
205 			point = reference[i];
206 		}
207 	}	
208 	return point;
209 }
210 
211 /*
212  * Removes an element from an array
213  */
214 function removeElementFromArray(ar, el){
215 	for (var i=0;i<ar.length;i++){
216 		if (ar[i] == el){
217 			ar.splice(i,1);
218 			return ar;
219 		}
220 	}
221 	return ar;
222 }
223