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