Normand Briere
2019-04-22 a9e12f6c508810604c8c91ee15451776b08ce1a1
timeflow/vis/timeline/AxisTicMarks.java
....@@ -4,114 +4,119 @@
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, 4000);
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
+ for (int i = 0; i < units.length; i++)
73
+ {
74
+ TimeUnit u = units[i];
75
+ long estimate = u.approxNumInRange(start, end);
76
+
77
+ if (estimate < maxTics)
78
+ {
79
+ AxisTicMarks t = new AxisTicMarks(u, start, end);
80
+ if (list.size() > 0)
81
+ {
82
+ AxisTicMarks last = list.get(0);
83
+ if (last.tics.size() == t.tics.size())
84
+ {
85
+ list.remove(0);
86
+ }
87
+ }
88
+ list.add(t);
89
+
90
+ }
91
+ }
92
+ while (list.size() > 2)
93
+ {
94
+ list.remove(0);
95
+ }
96
+
97
+ if (list.size() == 0) // uh oh! must be many years. we will add in bigger increments.
98
+ {
99
+ long length = end - start;
100
+ long size = 365 * 24 * 60 * 60 * 1000L;
101
+ int m = 1;
102
+ maxTics = 15;
103
+ while (m < 2000000000 && length / (m * size) > maxTics)
104
+ {
105
+ if (length / (2 * m * size) <= maxTics)
106
+ {
107
+ m *= 2;
108
+ break;
109
+ }
110
+ if (length / (5 * m * size) <= maxTics)
111
+ {
112
+ m *= 5;
113
+ break;
114
+ }
115
+ m *= 10;
116
+ }
117
+ AxisTicMarks t = new AxisTicMarks(TimeUnit.multipleYears(m), start, end);
118
+ list.add(t);
119
+ }
120
+ return list;
121
+ }
117122 }