1 | define(['./common'], function(common){ |
---|
2 | |
---|
3 | var textOffset = 4; // distance from line to text box |
---|
4 | var textYOffset = 20; // height of text box |
---|
5 | |
---|
6 | var positioning = {}; |
---|
7 | positioning.label = function(/*Object*/start, /*Object*/end){ |
---|
8 | // summary: |
---|
9 | // Returns the optimal text positions for annotations.Label. |
---|
10 | |
---|
11 | // label at middle of vector |
---|
12 | var x = 0.5*(start.x+end.x); |
---|
13 | var y = 0.5*(start.y+end.y); |
---|
14 | |
---|
15 | // move label a set distance from the line |
---|
16 | var slope = common.slope(start, end); |
---|
17 | var deltay = textOffset/Math.sqrt(1.0+slope*slope); |
---|
18 | |
---|
19 | if(end.y>start.y && end.x>start.x || end.y<start.y && end.x<start.x){ |
---|
20 | // Position depending on quadrant. Y offset |
---|
21 | // positions box aligned vertically from top |
---|
22 | deltay = -deltay; |
---|
23 | y -= textYOffset; |
---|
24 | } |
---|
25 | x += -deltay*slope; |
---|
26 | y += deltay; |
---|
27 | |
---|
28 | // want text to be away from start of vector |
---|
29 | // This will make force diagrams less crowded |
---|
30 | var align = end.x<start.x ? "end" : "start"; |
---|
31 | |
---|
32 | return { x:x, y:y, foo:"bar", align:align}; // Object |
---|
33 | }; |
---|
34 | |
---|
35 | positioning.angle = function(/*Object*/start, /*Object*/end){ |
---|
36 | // summary: |
---|
37 | // Returns the optimal position for annotations.Angle. |
---|
38 | |
---|
39 | // angle at first third of vector |
---|
40 | var x = 0.7*start.x+0.3*end.x; |
---|
41 | var y = 0.7*start.y+0.3*end.y; |
---|
42 | |
---|
43 | // move label a set distance from the line |
---|
44 | var slope = common.slope(start, end); |
---|
45 | var deltay = textOffset/Math.sqrt(1.0+slope*slope); |
---|
46 | |
---|
47 | if(end.x<start.x){deltay = -deltay;} |
---|
48 | x += -deltay * slope; |
---|
49 | y += deltay; |
---|
50 | |
---|
51 | // want text to be clockwise from vector |
---|
52 | // to match angle measurement from x-axis |
---|
53 | var align = end.y>start.y ? "end" : "start"; |
---|
54 | // box vertical aligned from middle |
---|
55 | y += end.x > start.x ? 0.5*textYOffset : -0.5*textYOffset; |
---|
56 | |
---|
57 | return { x:x, y:y, align:align}; // Object |
---|
58 | }; |
---|
59 | |
---|
60 | return positioning; |
---|
61 | }); |
---|
62 | |
---|