bzr branch
http://gegoxaren.bato24.eu/bzr/lenasys/trunk
20.1.1
by galaxyAbstractor
* Added an simple admin panel to the codeviewer-cmssy stuff |
1 |
/********************************************************************************
|
2 |
||
3 |
Mouse coordinate and canvas globals
|
|
4 |
|
|
5 |
Handles both Touch and Mouse/Keyboard input at the same time
|
|
6 |
|
|
7 |
*********************************************************************************/
|
|
8 |
||
9 |
// Mouse coordinate globals |
|
10 |
var gridx,gridy; |
|
11 |
var clickstate=0; |
|
12 |
||
13 |
var acanvas; |
|
14 |
var context; |
|
15 |
||
16 |
/********************************************************************************
|
|
17 |
||
18 |
Canvas Setup and Click Handling Code
|
|
19 |
|
|
20 |
Handles both Touch and Mouse/Keyboard input at the same time and executes
|
|
21 |
handler callbacks.
|
|
22 |
Also declares canvas globals
|
|
23 |
||
24 |
*********************************************************************************/
|
|
25 |
|
|
26 |
function setupcanvas() |
|
27 |
{ |
|
28 |
acanvas=document.getElementById('a'); |
|
29 |
context=acanvas.getContext("2d"); |
|
30 |
|
|
31 |
setTimeout("foo();",50); |
|
32 |
|
|
33 |
setupClickHandling(); |
|
34 |
} |
|
35 |
|
|
36 |
function setupClickHandling() |
|
37 |
{ |
|
38 |
// Mouse and Keyboard Events |
|
39 |
acanvas.addEventListener('mousemove', ev_mousemove, false); |
|
40 |
acanvas.addEventListener('mouseup', ev_mouseup, false); |
|
41 |
acanvas.addEventListener('mousedown', ev_mousedown, false); |
|
42 |
|
|
43 |
// Touch Events |
|
44 |
acanvas.addEventListener('touchstart', ev_touchstart, false); |
|
45 |
acanvas.addEventListener('touchend', ev_touchend, false); |
|
46 |
acanvas.addEventListener('touchmove', ev_touchmove, false); |
|
47 |
} |
|
48 |
|
|
49 |
// Keyboard/Mouse Mouse Up Handler |
|
50 |
function ev_mouseup(ev) |
|
51 |
{ |
|
52 |
handler_mouseup(); |
|
53 |
} |
|
54 |
|
|
55 |
// Keyboard/Mouse Mouse Down Handler |
|
56 |
function ev_mousedown(ev) |
|
57 |
{ |
|
58 |
handler_mousedown(ev); |
|
59 |
} |
|
60 |
||
61 |
// Keyboard/Mouse Mouse Move Handler |
|
62 |
function ev_mousemove (ev) |
|
63 |
{ |
|
64 |
var cx,cy=0; |
|
65 |
if (ev.layerX||ev.layerX==0) { // Firefox |
|
66 |
cx=ev.layerX-acanvas.offsetLeft; |
|
67 |
cy=ev.layerY-acanvas.offsetTop; |
|
68 |
} else if (ev.offsetX || ev.offsetX == 0) { // Opera |
|
69 |
cx=ev.offsetX-acanvas.offsetLeft; |
|
70 |
cy=ev.offsetY-acanvas.offsetTop; |
|
71 |
} |
|
72 |
||
73 |
coord=findPos(acanvas); |
|
74 |
cx=cx-coord.x; |
|
75 |
cy=cy-coord.y; |
|
76 |
||
77 |
handler_mousemove(cx,cy); |
|
78 |
} |
|
79 |
||
80 |
// Touch start event |
|
81 |
function ev_touchstart(event){ |
|
82 |
event.preventDefault(); |
|
83 |
var numtouch = event.touches.length; |
|
84 |
||
85 |
targetEvent = event.touches.item(0); |
|
86 |
||
87 |
var cx = targetEvent.pageX; |
|
88 |
var cy = targetEvent.pageY; |
|
89 |
|
|
90 |
gridx=cx; |
|
91 |
gridy=cy; |
|
92 |
||
93 |
handler_mousedown(); |
|
94 |
||
95 |
}; |
|
96 |
||
97 |
// Touch end event |
|
98 |
function ev_touchend(event){ |
|
99 |
event.preventDefault(); |
|
100 |
var numtouch = event.touches.length; |
|
101 |
||
102 |
handler_mouseup(); |
|
103 |
}; |
|
104 |
|
|
105 |
// Touch move event |
|
106 |
function ev_touchmove(event){ |
|
107 |
event.preventDefault(); |
|
108 |
var numtouch = event.touches.length; |
|
109 |
||
110 |
targetEvent = event.touches.item(0); |
|
111 |
||
112 |
var cx = targetEvent.pageX; |
|
113 |
var cy = targetEvent.pageY; |
|
114 |
|
|
115 |
handler_mousemove(cx,cy); |
|
116 |
}; |
|
117 |
||
118 |
// Fix scrolling on touch devices |
|
119 |
var ScrollFix = function(elem) { |
|
120 |
// Variables to track inputs |
|
121 |
var startY, startTopScroll; |
|
122 |
|
|
123 |
elem = elem || document.querySelector(elem); |
|
124 |
|
|
125 |
// If there is no element, then do nothing |
|
126 |
if(!elem) |
|
127 |
return; |
|
128 |
|
|
129 |
// Handle the start of interactions |
|
130 |
elem.addEventListener('touchstart', function(event){ |
|
131 |
startY = event.touches[0].pageY; |
|
132 |
startTopScroll = elem.scrollTop; |
|
133 |
|
|
134 |
if(startTopScroll <= 0) |
|
135 |
elem.scrollTop = 1; |
|
136 |
|
|
137 |
if(startTopScroll + elem.offsetHeight >= elem.scrollHeight) |
|
138 |
elem.scrollTop = elem.scrollHeight - elem.offsetHeight - 1; |
|
139 |
}, false); |
|
140 |
}; |
|
141 |
||
142 |
/********************************************************************************
|
|
143 |
||
144 |
Canvas Diagram Drawing Code
|
|
145 |
||
146 |
*********************************************************************************/
|
|
147 |
||
148 |
// Draws a stroked rectangle of certain thicknes and color |
|
149 |
||
150 |
function drawrect(x1,y1,x2,y2,color) |
|
151 |
{ |
|
152 |
context.lineWidth = 1.5; |
|
153 |
context.strokeStyle = color; |
|
154 |
context.strokeRect(x1,y1,x2-x1,y2-y1); |
|
155 |
} |
|
156 |
||
157 |
|
|
158 |
||
159 |
// Draws a perfect round circle |
|
160 |
|
|
161 |
function drawcircle(radius,color) |
|
162 |
{ |
|
163 |
context.lineWidth = 1.5; |
|
164 |
context.strokeStyle = color; |
|
165 |
context.arc(0, 0, radius, 0 , 2 * Math.PI, false); |
|
166 |
} |
|
167 |
||
168 |
// Draws 90 degree arc |
|
169 |
|
|
170 |
function drawellipse(x1,y1,x2,y2) |
|
171 |
{ |
|
172 |
||
173 |
var rx=(x2-x1)*0.5; |
|
174 |
var ry=(y2-y1)*0.5; |
|
175 |
||
176 |
context.beginPath(); |
|
177 |
||
178 |
context.moveTo(x1,y1+ry); |
|
179 |
context.quadraticCurveTo(x1,y1,x1+rx,y1); |
|
180 |
context.quadraticCurveTo(x2,y1,x2,y1+ry); |
|
181 |
context.quadraticCurveTo(x2,y2,x2-rx,y2); |
|
182 |
context.quadraticCurveTo(x1,y2,x1,y1+ry); |
|
183 |
||
184 |
context.stroke(); |
|
185 |
} |
|
186 |
|
|
187 |
// Draw a point |
|
188 |
|
|
189 |
function point(x,y,col) |
|
190 |
{ |
|
191 |
context.strokeStyle="#000"; |
|
192 |
context.lineWidth = 1; |
|
193 |
|
|
194 |
context.fillStyle=col; |
|
195 |
context.fillRect(x-4,y-4,8,8); |
|
196 |
context.strokeRect(x-4,y-4,8,8); |
|
197 |
} |
|
198 |
|
|
199 |
// Draw a box around a point to indicate highlight |
|
200 |
|
|
201 |
function highlight(px,py) |
|
202 |
{ |
|
203 |
context.strokeStyle="#aaa"; |
|
204 |
context.lineWidth = 1; |
|
205 |
|
|
206 |
context.strokeRect(px-8,py-8,16,16); |
|
207 |
|
|
208 |
} |
|
209 |
|
|
210 |
// Draw a line using current context |
|
211 |
|
|
212 |
function drawline(x1,y1,x2,y2,strokestyle,linewidth) |
|
213 |
{ |
|
214 |
context.strokeStyle = strokestyle; |
|
215 |
context.lineWidth = linewidth; |
|
216 |
context.beginPath(); |
|
217 |
context.moveTo(x1,y1); |
|
218 |
context.lineTo(x2,y2); |
|
219 |
context.stroke(); |
|
220 |
} |
|
221 |
|
|
222 |
function fourpoints(x1,y1,x2,y2,x3,y3,x4,y4,col) |
|
223 |
{ |
|
224 |
point(x1,y1,col); |
|
225 |
point(x2,y2,col); |
|
226 |
point(x3,y3,col); |
|
227 |
point(x4,y4,col); |
|
228 |
} |
|
229 |
|
|
230 |
function drawdiamond(x1,y1,x2,y2) |
|
231 |
{ |
|
232 |
var rx=(x2-x1)*0.5; |
|
233 |
var ry=(y2-y1)*0.5; |
|
234 |
||
235 |
context.beginPath(); |
|
236 |
context.moveTo(x1,y1+ry); |
|
237 |
context.lineTo(x1+rx,y2); |
|
238 |
context.lineTo(x2,y1+ry); |
|
239 |
context.lineTo(x1+rx,y1); |
|
240 |
context.lineTo(x1,y1+ry); |
|
241 |
context.stroke(); |
|
242 |
} |
|
243 |
|
|
244 |
// Dashed Line in Segments of given size |
|
245 |
|
|
246 |
function dashedline(sx,sy,ex,ey,dashlen,linewidth,col) |
|
247 |
{ |
|
248 |
|
|
249 |
var dx=ex-sx; |
|
250 |
var dy=ey-sy; |
|
251 |
|
|
252 |
len=Math.sqrt((dx*dx)+(dy*dy)); |
|
253 |
notimes=Math.round(len/dashlen); |
|
254 |
|
|
255 |
dx=dx/notimes; |
|
256 |
dy=dy/notimes; |
|
257 |
|
|
258 |
context.lineWidth = linewidth; |
|
259 |
context.strokeStyle=col; |
|
260 |
||
261 |
context.beginPath(); |
|
262 |
||
263 |
var xk,yk; |
|
264 |
xk=sx; |
|
265 |
yk=sy; |
|
266 |
xh=dx/2.0; |
|
267 |
yh=dy/2.0; |
|
268 |
for(var i=0;i<notimes;i++){ |
|
269 |
||
270 |
context.moveTo(xk,yk); |
|
271 |
context.lineTo(xk+xh,yk+yh); |
|
272 |
|
|
273 |
xk+=dx; |
|
274 |
yk+=dy; |
|
275 |
} |
|
276 |
|
|
277 |
context.stroke(); |
|
278 |
|
|
279 |
} |
|
280 |
|
|
281 |
// Arcto only works if both x1 and y2 are on circle border |
|
282 |
|
|
283 |
function arcto(x0,y0,x1,y1,x2,y2) |
|
284 |
{ |
|
285 |
||
286 |
var r = Math.sqrt((x1-x0)*(x1-x0) + (y1-y0)*(y1-y0)); |
|
287 |
var x = x0-r; |
|
288 |
var y = y0-r; |
|
289 |
var startAngle = (180/Math.PI*Math.atan2(y1-y0, x1-x0)); |
|
290 |
var endAngle = (180/Math.PI*Math.atan2(y2-y0, x2-x0)); |
|
291 |
|
|
292 |
context.arc(x0, y0, r, 0, Math.PI*2.0, 1.0); |
|
293 |
||
294 |
} |
|
295 |
||
296 |
// Draws 90 degree arc |
|
297 |
|
|
298 |
function arcdeg(x1,y1,x2,y2,x3,y3) |
|
299 |
{ |
|
300 |
|
|
301 |
||
302 |
// First quadrant positive positive |
|
303 |
dashedline(x1,y1,x2,y2,8,1.0,"#999"); |
|
304 |
dashedline(x3,y3,x2,y2,8,1.0,"#999"); |
|
305 |
||
306 |
point(x1,y1,"#ff5"); |
|
307 |
point(x2,y2,"#f55"); |
|
308 |
point(x3,y3,"#f55"); |
|
309 |
|
|
310 |
k=(y3-y1)/(x3-x1); |
|
311 |
|
|
312 |
yk=y1+((x2-x1)*k); |
|
313 |
|
|
314 |
rx=x3-x1; |
|
315 |
ry=y3-y1; |
|
316 |
||
317 |
point(x2,yk,"#f5f"); |
|
318 |
||
319 |
context.strokeStyle = '#49f'; |
|
320 |
context.lineWidth = 1.0; |
|
321 |
context.beginPath(); |
|
322 |
context.moveTo(x1,y1); |
|
323 |
for(i=0;i<48;i++){ |
|
324 |
if(y3>=y1){ |
|
325 |
if(yk>=y2){ |
|
326 |
context.lineTo(x1+(Math.sin(((Math.PI/96.0)*-i)+(Math.PI*1.0))*rx),y3+(Math.cos(((Math.PI/96.0)*-i)+(Math.PI*1.0))*ry)); |
|
327 |
}else{ |
|
328 |
context.lineTo(x3+(Math.sin(((Math.PI/96.0)*i)+(Math.PI*1.5))*rx),y1+(Math.cos(((Math.PI/96.0)*i)+(Math.PI*1.5))*ry)); |
|
329 |
} |
|
330 |
}else{ |
|
331 |
if(yk<=y2){ |
|
332 |
context.lineTo(x1+(Math.sin(((Math.PI/96.0)*-i)+(Math.PI*1.0))*rx),y3+(Math.cos(((Math.PI/96.0)*-i)+(Math.PI*1.0))*ry)); |
|
333 |
}else{ |
|
334 |
context.lineTo(x3+(Math.sin(((Math.PI/96.0)*i)+(Math.PI*1.5))*rx),y1+(Math.cos(((Math.PI/96.0)*i)+(Math.PI*1.5))*ry)); |
|
335 |
} |
|
336 |
} |
|
337 |
} |
|
338 |
context.stroke(); |
|
339 |
||
340 |
} |
|
341 |
|
|
342 |
// function that draws one part of the sun |
|
343 |
|
|
344 |
function sundial(radius,angle,scale) |
|
345 |
{ |
|
346 |
|
|
347 |
cosv=Math.cos(angle); |
|
348 |
sinv=Math.sin(angle); |
|
349 |
|
|
350 |
yaddx=scale*cosv; |
|
351 |
yaddy=scale*sinv; |
|
352 |
|
|
353 |
xaddx=-scale*sinv; |
|
354 |
xaddy=scale*cosv; |
|
355 |
||
356 |
xk=cosv*radius; |
|
357 |
yk=sinv*radius; |
|
358 |
||
359 |
context.bezierCurveTo((-1.5*xaddx)+(yaddx*1.5)+xk,(-1.5*xaddy)+(yaddy*1.5)+yk,xaddx+(yaddx*2.0)+xk,xaddy+(yaddy*2.0)+yk,xaddx+(yaddx*3.0)+xk,xaddy+(yaddy*3.0)+yk); |
|
360 |
context.bezierCurveTo(xaddx+yaddx+xk,xaddy+yaddy+yk,(1.5*xaddx)+yaddx+xk,(1.5*xaddy)+yaddy+yk,(3.0*xaddx)+xk,(3.0*xaddy)+yk); |
|
361 |
} |
|
362 |
||
363 |
// function that daws the sun |
|
364 |
|
|
365 |
function drawsun() |
|
366 |
{ |
|
367 |
context.fillStyle = "#fe9"; |
|
368 |
context.strokeStyle = "#d82"; |
|
369 |
context.lineWidth = 1.5; |
|
370 |
|
|
371 |
context.beginPath(); |
|
372 |
context.moveTo(30,0); |
|
373 |
for(i=0.0;i<360.0;i+=22.5){ |
|
374 |
angle=(i/360.0)*2*Math.PI; |
|
375 |
sundial(30,angle,3); |
|
376 |
} |
|
377 |
context.stroke(); |
|
378 |
context.fill(); |
|
379 |
} |
|
380 |
|
|
381 |
// Draws the ball (used in various examples) |
|
382 |
|
|
383 |
function drawball(cx,cy,radie,innerradie,ballradie,col1,inangle,inangleadd) |
|
384 |
{ |
|
385 |
|
|
386 |
angleadd=(inangleadd/360.0)*2*Math.PI; |
|
387 |
|
|
388 |
context.fillStyle = col1; |
|
389 |
|
|
390 |
for(i=0;i<360;i+=inangle){ |
|
391 |
|
|
392 |
angle=(i/360.0)*2*Math.PI; |
|
393 |
angle2=angle+angleadd; |
|
394 |
angle3=angle+(angleadd*2.0); |
|
395 |
angle4=angle-angleadd; |
|
396 |
||
397 |
cosv=Math.cos(angle); |
|
398 |
sinv=Math.sin(angle); |
|
399 |
||
400 |
cosv2=Math.cos(angle2); |
|
401 |
sinv2=Math.sin(angle2); |
|
402 |
||
403 |
cosv4=Math.cos(angle4); |
|
404 |
sinv4=Math.sin(angle4); |
|
405 |
|
|
406 |
context.beginPath(); |
|
407 |
||
408 |
context.moveTo(cx,cy); |
|
409 |
context.quadraticCurveTo(cx+(cosv*innerradie),cy+(sinv*innerradie),cx+(cosv2*radie),cy+(sinv2*radie)); |
|
410 |
context.arc(cx,cy,radie,angle2,angle,1.0); |
|
411 |
context.quadraticCurveTo(cx+(cosv4*innerradie),cy+(sinv4*innerradie),cx,cy); |
|
412 |
|
|
413 |
context.fill(); |
|
414 |
|
|
415 |
} |
|
416 |
|
|
417 |
context.beginPath(); |
|
418 |
context.arc(cx,cy,radie,0,Math.PI*2.0,1.0); |
|
419 |
context.stroke(); |
|
420 |
|
|
421 |
} |
|
422 |
|
|
423 |
// Draws underlined/dashed underlined text clipped inside a rectangle, a quadratic curve ellipsis or a diamond |
|
424 |
|
|
425 |
function cliptext(x1,y1,x2,y2,tex,font,align,edgeoffs,baseline,color,clipkind,underlinekind) |
|
426 |
{ |
|
427 |
||
428 |
var rx=(x2-x1)*0.5; |
|
429 |
var ry=(y2-y1)*0.5; |
|
430 |
|
|
431 |
var tx=x1; |
|
432 |
||
433 |
if(clipkind!=0){ |
|
434 |
context.save(); |
|
435 |
context.beginPath(); |
|
436 |
} |
|
437 |
|
|
438 |
// Make Rectangle / Ellipse / Diamond Clipping Paths |
|
439 |
if(clipkind==1){ |
|
440 |
context.moveTo(x1,y1); |
|
441 |
context.lineTo(x1,y2); |
|
442 |
context.lineTo(x2-edgeoffs,y2); |
|
443 |
context.lineTo(x2-edgeoffs,y1); |
|
444 |
context.lineTo(x1,y1); |
|
445 |
}else if(clipkind==2){ |
|
446 |
context.moveTo(x1,y1+ry); |
|
447 |
context.quadraticCurveTo(x1+edgeoffs,y1+edgeoffs,x1+edgeoffs+rx,y1+edgeoffs); |
|
448 |
context.quadraticCurveTo(x2-edgeoffs,y1+edgeoffs,x2-edgeoffs,y1+ry+edgeoffs); |
|
449 |
context.quadraticCurveTo(x2-edgeoffs,y2-edgeoffs,x2-rx-edgeoffs,y2-edgeoffs); |
|
450 |
context.quadraticCurveTo(x1+edgeoffs,y2-edgeoffs,x1+edgeoffs,y1+ry+edgeoffs); |
|
451 |
}else if(clipkind==3){ |
|
452 |
context.moveTo(x1,y1+ry); |
|
453 |
context.lineTo(x1+rx,y2); |
|
454 |
context.lineTo(x2,y1+ry); |
|
455 |
context.lineTo(x1+rx,y1); |
|
456 |
context.lineTo(x1,y1+ry); |
|
457 |
} |
|
458 |
||
459 |
if(clipkind!=0){ |
|
460 |
context.clip(); |
|
461 |
} |
|
462 |
||
463 |
context.font = font; |
|
464 |
context.textAlign = "left"; |
|
465 |
context.fillStyle = color; |
|
466 |
||
467 |
var metrics = context.measureText(tex); |
|
468 |
var hwidth = metrics.width*0.5; |
|
469 |
|
|
470 |
// Compute left-justified centered coordinate |
|
471 |
if((rx-hwidth-edgeoffs)<0){ |
|
472 |
tx=x1+edgeoffs; |
|
473 |
}else{ |
|
474 |
tx=x1+rx-hwidth; |
|
475 |
} |
|
476 |
|
|
477 |
context.fillText(tex, tx, y2-ry+baseline); |
|
478 |
||
479 |
// Draw underlining - can handle dashed underline! |
|
480 |
if(underlinekind==1){ |
|
481 |
drawline(tx,y2-ry+baseline+5.0,tx+(hwidth*2),y2-ry+baseline+5.0,"#000",2.0); |
|
482 |
} |
|
483 |
|
|
484 |
if(clipkind!=0) context.restore(); |
|
485 |
||
486 |
} |
|
487 |
|
|
488 |
// Draws cardinality at a certain offset from a coordinate |
|
489 |
function drawcardinality(x,y,side,tex,xoffs,yoffs,font,baseline,sign,color) |
|
490 |
{ |
|
491 |
// Xoffs is along line |
|
492 |
xoffs=0; |
|
493 |
// Yoffs is distance from line |
|
494 |
yoffs=10; |
|
495 |
|
|
496 |
var metrics = context.measureText(tex); |
|
497 |
var twidth = metrics.width; |
|
498 |
var theight = 12; |
|
499 |
||
500 |
point(x,y,"#f8f"); |
|
501 |
||
502 |
context.font = font; |
|
503 |
context.textAlign = "left"; |
|
504 |
context.fillStyle = color; |
|
505 |
||
506 |
if(side==1&&sign==1){ |
|
507 |
context.fillText(tex, x-twidth-xoffs, y-yoffs); |
|
508 |
drawrect(x-twidth-xoffs, y-yoffs,x-xoffs, y-yoffs-theight); |
|
509 |
}else if(side==2&&sign==1){ |
|
510 |
context.fillText(tex, x+yoffs, y+xoffs+theight); |
|
511 |
drawrect(x+yoffs, y+xoffs+theight,x+yoffs+twidth, y+xoffs); |
|
512 |
}else if(side==3&&sign==1){ |
|
513 |
context.fillText(tex, x+xoffs, y-yoffs); |
|
514 |
}else if(side==4&&sign==1){ |
|
515 |
context.fillText(tex, x+yoffs, y-xoffs); |
|
516 |
}else if(side==1&&sign==2){ |
|
517 |
context.fillText(tex, x-twidth-xoffs, y+theight+yoffs); |
|
518 |
drawrect(x-twidth-xoffs, y+yoffs,x-xoffs, y+theight+yoffs); |
|
519 |
}else if(side==2&&sign==2){ |
|
520 |
context.fillText(tex, x-yoffs-twidth, y+xoffs+theight); |
|
521 |
drawrect(x-yoffs-twidth, y+xoffs,x-yoffs, y+xoffs+theight); |
|
522 |
}else if(side==3&&sign==2){ |
|
523 |
context.fillText(tex, x+xoffs, y+theight+yoffs); |
|
524 |
}else if(side==4&&sign==2){ |
|
525 |
context.fillText(tex, x-yoffs-twidth, y-xoffs); |
|
526 |
} |
|
527 |
||
528 |
} |
|
529 |
||
530 |
|
|
531 |
/********************************************************************************
|
|
532 |
||
533 |
Canvas and Diagram Measuring Functions
|
|
534 |
|
|
535 |
These functions allow us to measure pixels in diagram and other apps
|
|
536 |
||
537 |
*********************************************************************************/
|
|
538 |
|
|
539 |
|
|
540 |
// Recursive Pos of div in document - should work in most browsers |
|
541 |
|
|
542 |
function findPos(obj) { |
|
543 |
var curleft = curtop = 0; |
|
544 |
if (obj.offsetParent) { |
|
545 |
curleft = obj.offsetLeft |
|
546 |
curtop = obj.offsetTop |
|
547 |
while (obj = obj.offsetParent) { |
|
548 |
curleft += obj.offsetLeft |
|
549 |
curtop += obj.offsetTop |
|
550 |
} |
|
551 |
} |
|
552 |
return { |
|
553 |
x:curleft, |
|
554 |
y:curtop |
|
555 |
} |
|
556 |
} |
|
557 |
|
|
558 |
// Make side coordinates for drawing Model |
|
559 |
||
560 |
function makeside(side,x1,y1,x2,y2,perc){ |
|
561 |
|
|
562 |
var xk=0; |
|
563 |
var yk=0; |
|
564 |
|
|
565 |
if(side==1){ |
|
566 |
xk=x1; |
|
567 |
yk=y1+((y2-y1)*perc); |
|
568 |
}else if(side==2){ |
|
569 |
xk=x1+((x2-x1)*perc); |
|
570 |
yk=y2; |
|
571 |
}else if(side==3){ |
|
572 |
xk=x2; |
|
573 |
yk=y1+((y2-y1)*perc); |
|
574 |
}else if(side==4){ |
|
575 |
xk=x1+((x2-x1)*perc) |
|
576 |
yk=y1; |
|
577 |
} |
|
578 |
|
|
579 |
return { |
|
580 |
x:xk, |
|
581 |
y:yk |
|
582 |
} |
|
583 |
|
|
584 |
} |
|
585 |
|
|
586 |
// Computes side identifier for a mouse coordinate and object coordinates |
|
587 |
|
|
588 |
function computeside(x,y,x1,y1,x2,y2,sidetol){ |
|
589 |
|
|
590 |
var obj_sidentifier="None"; |
|
591 |
var obj_sideperc=0; |
|
592 |
var obj_centerdist=0; |
|
593 |
|
|
594 |
// Left Side |
|
595 |
if(x>x1-sidetol&&x<x1+sidetol&&y>y1-sidetol&&y<y2+sidetol){ |
|
596 |
obj_sidentifier=1; |
|
597 |
obj_sideperc=makesideperc(y,y1,y2); |
|
598 |
obj_centerdist=centerdist(y,y1,y2); |
|
599 |
} |
|
600 |
||
601 |
// Bottom Not Including Left Side or Right Side |
|
602 |
if(x>x1+sidetol&&x<x2-sidetol&&y>y2-sidetol&&y<y2+sidetol){ |
|
603 |
obj_sidentifier=2; |
|
604 |
obj_sideperc=makesideperc(x,x1,x2); |
|
605 |
obj_centerdist=centerdist(x,x1,x2); |
|
606 |
} |
|
607 |
||
608 |
// Right Side |
|
609 |
if(x>x2-sidetol&&x<x2+sidetol&&y>y1-sidetol&&y<y2+sidetol){ |
|
610 |
obj_sidentifier=3; |
|
611 |
obj_sideperc=makesideperc(y,y1,y2); |
|
612 |
obj_centerdist=centerdist(y,y1,y2); |
|
613 |
} |
|
614 |
|
|
615 |
// Top Not Including Left Side or Right Side |
|
616 |
if(x>x1+sidetol&&x<x2-sidetol&&y>y1-sidetol&&y<y1+sidetol){ |
|
617 |
obj_sidentifier=4; |
|
618 |
obj_sideperc=makesideperc(x,x1,x2); |
|
619 |
obj_centerdist=centerdist(x,x1,x2); |
|
620 |
} |
|
621 |
|
|
622 |
return { |
|
623 |
side:obj_sidentifier, |
|
624 |
perc:obj_sideperc, |
|
625 |
dist:obj_centerdist |
|
626 |
} |
|
627 |
|
|
628 |
} |
|
629 |
|
|
630 |
// Make side perc for ER model |
|
631 |
|
|
632 |
function makesideperc(x,x1,x2){ |
|
633 |
r=x2-x1; |
|
634 |
perc=(x-x1)/r; |
|
635 |
||
636 |
if(perc>1.0) perc=1.0; |
|
637 |
if(perc<0.0) perc=0.0; |
|
638 |
||
639 |
return perc; |
|
640 |
} |
|
641 |
|
|
642 |
function centerdist(x,x1,x2){ |
|
643 |
r=x1+((x2-x1)*0.5); |
|
644 |
|
|
645 |
return (x-r); |
|
646 |
} |
|
647 |
|
|
648 |
// Euclidian distance - Yo! |
|
649 |
|
|
650 |
function distance(x1,y1,x2,y2){ |
|
651 |
|
|
652 |
var dist=Math.sqrt(((y2-y1)*(y2-y1))+((x2-x1)*(x2-x1))); |
|
653 |
|
|
654 |
return dist; |
|
655 |
} |
|
656 |
||
657 |
// Are we over a line or not. |
|
658 |
||
659 |
function overline(x,y,x1,y1,x2,y2,tolerance) |
|
660 |
{ |
|
661 |
var distance=10000; |
|
662 |
|
|
663 |
|
|
664 |
dx=x2-x1; |
|
665 |
dy=y2-y1; |
|
666 |
|
|
667 |
straighttolerance=2.0; |
|
668 |
|
|
669 |
var box1,boy1,box2,boy2; |
|
670 |
|
|
671 |
if(x1>x2){ |
|
672 |
box1=x2; |
|
673 |
box2=x1; |
|
674 |
}else{ |
|
675 |
box1=x1; |
|
676 |
box2=x2; |
|
677 |
} |
|
678 |
||
679 |
if(y1>y2){ |
|
680 |
boy1=y2; |
|
681 |
boy2=y1; |
|
682 |
}else{ |
|
683 |
boy1=y1; |
|
684 |
boy2=y2; |
|
685 |
} |
|
686 |
|
|
687 |
// drawrect(box1-tolerance,boy1-tolerance,box2+tolerance,boy2+tolerance,"#aaa");
|
|
688 |
|
|
689 |
if((x>(box1-tolerance))&&(x<(box2+tolerance))&&(y>(boy1-tolerance))&&(y<(boy2+tolerance))){ |
|
690 |
// Straight X, Straight Y or Positive or Negative Incline |
|
691 |
if(Math.abs(dx)<straighttolerance){ |
|
692 |
if(y1<y2){ |
|
693 |
if(y>y1-tolerance&&y<y2+tolerance){ |
|
694 |
distance=Math.abs(x1-x); |
|
695 |
} |
|
696 |
}else{ |
|
697 |
if(y>y2-tolerance&&y<y1+tolerance){ |
|
698 |
distance=Math.abs(x1-x); |
|
699 |
} |
|
700 |
} |
|
701 |
}else if(Math.abs(dy)<straighttolerance){ |
|
702 |
if(x1<x2){ |
|
703 |
if(x>x1-tolerance&&x<x2+tolerance){ |
|
704 |
distance=Math.abs(y1-y); |
|
705 |
} |
|
706 |
}else{ |
|
707 |
if(x>x2-tolerance&&x<x1+tolerance){ |
|
708 |
distance=Math.abs(y1-y); |
|
709 |
} |
|
710 |
} |
|
711 |
}else if(Math.abs(dx)>=Math.abs(dy)){ |
|
712 |
k=dy/dx; |
|
713 |
yk=y1+((x-x1)*k); |
|
714 |
distance=Math.abs(yk-y); |
|
715 |
}else{ |
|
716 |
k=dx/dy; |
|
717 |
xk=x1+((y-y1)*k); |
|
718 |
distance=Math.abs(xk-x); |
|
719 |
} |
|
720 |
} |
|
721 |
|
|
722 |
return distance; |
|
723 |
|
|
724 |
} |