Normand Briere
2018-12-21 dcda2c5fa15e63daad67f5720a2f726e34f8cd71
timeflow/vis/timeline/AxisTicMarks.java
....@@ -4,114 +4,120 @@
44
55 import timeflow.data.time.*;
66
7
-public class AxisTicMarks {
8
- public TimeUnit unit;
9
- public List<Long> tics;
10
-
11
- private static final TimeUnit[] units={
12
- TimeUnit.YEAR, TimeUnit.MONTH, TimeUnit.DAY, TimeUnit.HOUR, TimeUnit.MINUTE, TimeUnit.SECOND
13
- };
14
-
15
- private static final TimeUnit[] histUnits={
16
- TimeUnit.YEAR.times(100), TimeUnit.YEAR.times(50), TimeUnit.YEAR.times(25),
17
- TimeUnit.YEAR.times(10), TimeUnit.YEAR.times(5), TimeUnit.YEAR.times(2), TimeUnit.YEAR,
18
- TimeUnit.MONTH.times(6), TimeUnit.MONTH.times(3), TimeUnit.MONTH.times(2), TimeUnit.MONTH,
19
- TimeUnit.WEEK, TimeUnit.DAY.times(2), TimeUnit.DAY,
7
+public class AxisTicMarks
8
+{
9
+ public TimeUnit unit;
10
+ public List<Long> tics;
11
+ private static final TimeUnit[] units =
12
+ {
13
+ TimeUnit.YEAR, TimeUnit.MONTH, TimeUnit.DAY, TimeUnit.HOUR, TimeUnit.MINUTE, TimeUnit.SECOND, TimeUnit.REALTIME
14
+ };
15
+ private static final TimeUnit[] histUnits =
16
+ {
17
+ TimeUnit.YEAR.times(100), TimeUnit.YEAR.times(50), TimeUnit.YEAR.times(25),
18
+ TimeUnit.YEAR.times(10), TimeUnit.YEAR.times(5), TimeUnit.YEAR.times(2), TimeUnit.YEAR,
19
+ TimeUnit.MONTH.times(6), TimeUnit.MONTH.times(3), TimeUnit.MONTH.times(2), TimeUnit.MONTH,
20
+ TimeUnit.WEEK, TimeUnit.DAY.times(2), TimeUnit.DAY,
21
+ TimeUnit.HOUR,
22
+ TimeUnit.MINUTE,
23
+ TimeUnit.SECOND,
24
+ TimeUnit.REALTIME
25
+ };
2026
21
- TimeUnit.HOUR,
22
- TimeUnit.MINUTE,
23
- TimeUnit.SECOND
24
- };
25
-
26
- public AxisTicMarks(TimeUnit unit, long start, long end)
27
- {
28
- this.unit=unit;
29
- tics=new ArrayList<Long>();
30
- RoughTime r=unit.roundDown(start);
31
- tics.add(r.getTime());
32
- do
33
- {
34
- unit.addTo(r);
35
- tics.add(r.getTime());
36
- } while (r.getTime()<end);
37
- }
38
-
39
-
40
-
41
- public static List<AxisTicMarks> allRelevant(Interval interval)
42
- {
43
- return allRelevant(interval.start, interval.end);
44
- }
45
-
46
- public static List<AxisTicMarks> allRelevant(long start, long end)
47
- {
48
- return allRelevant(start, end, 40);
49
- }
50
-
51
- public static AxisTicMarks histoTics(long start, long end)
52
- {
53
- for (int i=histUnits.length-1; i>=0; i--)
54
- {
55
- TimeUnit u=histUnits[i];
56
- long estimate=u.approxNumInRange(start, end);
57
- if (estimate<200 || i==0)
58
- {
59
- AxisTicMarks t=new AxisTicMarks(u, start, end);
60
- return t;
61
- }
62
- }
63
- return null;
64
- }
65
-
66
- public static List<AxisTicMarks> allRelevant(long start, long end, long maxTics)
67
- {
68
- List<AxisTicMarks> list=new ArrayList<AxisTicMarks>();
69
-
70
-
71
- for (int i=0; i<units.length; i++)
72
- {
73
- TimeUnit u=units[i];
74
- long estimate=u.approxNumInRange(start, end);
75
-
76
- if (estimate<maxTics)
77
- {
78
- AxisTicMarks t=new AxisTicMarks(u, start, end);
79
- if (list.size()>0)
80
- {
81
- AxisTicMarks last=list.get(0);
82
- if (last.tics.size()==t.tics.size())
83
- list.remove(0);
84
- }
85
- list.add(t);
86
-
87
- }
88
- }
89
- while (list.size()>2)
90
- list.remove(0);
91
-
92
- if (list.size()==0) // uh oh! must be many years. we will add in bigger increments.
93
- {
94
- long length=end-start;
95
- long size=365*24*60*60*1000L;
96
- int m=1;
97
- maxTics=15;
98
- while (m<2000000000 && length/(m*size)>maxTics)
99
- {
100
- if (length/(2*m*size)<=maxTics)
101
- {
102
- m*=2;
103
- break;
104
- }
105
- if (length/(5*m*size)<=maxTics)
106
- {
107
- m*=5;
108
- break;
109
- }
110
- m*=10;
111
- }
112
- AxisTicMarks t=new AxisTicMarks(TimeUnit.multipleYears(m), start, end);
113
- list.add(t);
114
- }
115
- return list;
116
- }
27
+ public AxisTicMarks(TimeUnit unit, long start, long end)
28
+ {
29
+ this.unit = unit;
30
+ tics = new ArrayList<Long>();
31
+ RoughTime r = unit.roundDown(start);
32
+ tics.add(r.getTime());
33
+ do
34
+ {
35
+ unit.addTo(r);
36
+ tics.add(r.getTime());
37
+ } while (r.getTime() < end);
38
+ }
39
+
40
+ public static List<AxisTicMarks> allRelevant(Interval interval)
41
+ {
42
+ return allRelevant(interval.start, interval.end);
43
+ }
44
+
45
+ public static List<AxisTicMarks> allRelevant(long start, long end)
46
+ {
47
+ return allRelevant(start, end, 40);
48
+ }
49
+
50
+ public static AxisTicMarks histoTics(long start, long end)
51
+ {
52
+ for (int i = histUnits.length; --i >= 0;)
53
+ {
54
+ TimeUnit u = histUnits[i];
55
+ long estimate = u.approxNumInRange(start, end);
56
+ if (estimate < 200 || i == 0)
57
+ {
58
+ if (i == 17)
59
+ i = 17;
60
+
61
+ AxisTicMarks t = new AxisTicMarks(u, start, end);
62
+ return t;
63
+ }
64
+ }
65
+ return null;
66
+ }
67
+
68
+ public static List<AxisTicMarks> allRelevant(long start, long end, long maxTics)
69
+ {
70
+ List<AxisTicMarks> list = new ArrayList<AxisTicMarks>();
71
+
72
+
73
+ for (int i = 0; i < units.length; i++)
74
+ {
75
+ TimeUnit u = units[i];
76
+ long estimate = u.approxNumInRange(start, end);
77
+
78
+ if (estimate < maxTics)
79
+ {
80
+ AxisTicMarks t = new AxisTicMarks(u, start, end);
81
+ if (list.size() > 0)
82
+ {
83
+ AxisTicMarks last = list.get(0);
84
+ if (last.tics.size() == t.tics.size())
85
+ {
86
+ list.remove(0);
87
+ }
88
+ }
89
+ list.add(t);
90
+
91
+ }
92
+ }
93
+ while (list.size() > 2)
94
+ {
95
+ list.remove(0);
96
+ }
97
+
98
+ if (list.size() == 0) // uh oh! must be many years. we will add in bigger increments.
99
+ {
100
+ long length = end - start;
101
+ long size = 365 * 24 * 60 * 60 * 1000L;
102
+ int m = 1;
103
+ maxTics = 15;
104
+ while (m < 2000000000 && length / (m * size) > maxTics)
105
+ {
106
+ if (length / (2 * m * size) <= maxTics)
107
+ {
108
+ m *= 2;
109
+ break;
110
+ }
111
+ if (length / (5 * m * size) <= maxTics)
112
+ {
113
+ m *= 5;
114
+ break;
115
+ }
116
+ m *= 10;
117
+ }
118
+ AxisTicMarks t = new AxisTicMarks(TimeUnit.multipleYears(m), start, end);
119
+ list.add(t);
120
+ }
121
+ return list;
122
+ }
117123 }