Normand Briere
2018-07-11 1e74123cfed4374b403574b6cd16bd8d4e73bf45
timeflow/vis/timeline/AxisTicMarks.java
....@@ -4,114 +4,116 @@
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
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
+ };
2025
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
- }
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
+ public static List<AxisTicMarks> allRelevant(Interval interval)
40
+ {
41
+ return allRelevant(interval.start, interval.end);
42
+ }
43
+
44
+ public static List<AxisTicMarks> allRelevant(long start, long end)
45
+ {
46
+ return allRelevant(start, end, 40);
47
+ }
48
+
49
+ public static AxisTicMarks histoTics(long start, long end)
50
+ {
51
+ for (int i = histUnits.length - 1; i >= 0; i--)
52
+ {
53
+ TimeUnit u = histUnits[i];
54
+ long estimate = u.approxNumInRange(start, end);
55
+ if (estimate < 200 || i == 0)
56
+ {
57
+ AxisTicMarks t = new AxisTicMarks(u, start, end);
58
+ return t;
59
+ }
60
+ }
61
+ return null;
62
+ }
63
+
64
+ public static List<AxisTicMarks> allRelevant(long start, long end, long maxTics)
65
+ {
66
+ List<AxisTicMarks> list = new ArrayList<AxisTicMarks>();
67
+
68
+
69
+ for (int i = 0; i < units.length; i++)
70
+ {
71
+ TimeUnit u = units[i];
72
+ long estimate = u.approxNumInRange(start, end);
73
+
74
+ if (estimate < maxTics)
75
+ {
76
+ AxisTicMarks t = new AxisTicMarks(u, start, end);
77
+ if (list.size() > 0)
78
+ {
79
+ AxisTicMarks last = list.get(0);
80
+ if (last.tics.size() == t.tics.size())
81
+ {
82
+ list.remove(0);
83
+ }
84
+ }
85
+ list.add(t);
86
+
87
+ }
88
+ }
89
+ while (list.size() > 2)
90
+ {
91
+ list.remove(0);
92
+ }
93
+
94
+ if (list.size() == 0) // uh oh! must be many years. we will add in bigger increments.
95
+ {
96
+ long length = end - start;
97
+ long size = 365 * 24 * 60 * 60 * 1000L;
98
+ int m = 1;
99
+ maxTics = 15;
100
+ while (m < 2000000000 && length / (m * size) > maxTics)
101
+ {
102
+ if (length / (2 * m * size) <= maxTics)
103
+ {
104
+ m *= 2;
105
+ break;
106
+ }
107
+ if (length / (5 * m * size) <= maxTics)
108
+ {
109
+ m *= 5;
110
+ break;
111
+ }
112
+ m *= 10;
113
+ }
114
+ AxisTicMarks t = new AxisTicMarks(TimeUnit.multipleYears(m), start, end);
115
+ list.add(t);
116
+ }
117
+ return list;
118
+ }
117119 }