1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
package org.singinst.uf.presenter;
import org.singinst.uf.math.SimplePoint;
import org.singinst.uf.model.Axis;
import org.singinst.uf.model.ScalarRelation;
public abstract class AxisDirection {
public static final AxisDirection X = new AxisDirection() {
@Override
protected void drawPerpindicularLine(GraphCanvas canvas,
double parallelOffset, double perpindicularOffset1,
double perpindicularOffset2) {
canvas.drawLine(SimpleLine.vertical(parallelOffset, perpindicularOffset1, perpindicularOffset2));
}
@Override
protected Axis getAxis(ScalarRelation relation) {
return relation.getDomain();
}
@Override
protected Axis getPerpindicularAxis(ScalarRelation relation) {
return relation.getRange();
}
@Override
protected void write(GraphCanvas hypothesisCanvas, ScalarRelation relation,
double parallelOffset,
double centParallel, double centPerpindicular,
CanvasString canvasString) {
hypothesisCanvas.write(
new SimplePoint(parallelOffset - 1.5 * centParallel,
relation.getRange().getLineBounds().getLowerBound() - 5 * centPerpindicular),
canvasString);
}
};
public static final AxisDirection Y = new AxisDirection() {
@Override
protected void drawPerpindicularLine(GraphCanvas canvas,
double parallelOffset, double perpindicularOffset1,
double perpindicularOffset2) {
canvas.drawLine(SimpleLine.horizontal(perpindicularOffset1, perpindicularOffset2, parallelOffset));
}
@Override
protected Axis getAxis(ScalarRelation relation) {
return relation.getRange();
}
@Override
protected Axis getPerpindicularAxis(ScalarRelation relation) {
return relation.getDomain();
}
@Override
protected void write(GraphCanvas hypothesisCanvas, ScalarRelation relation,
double parallelOffset,
double centParallel, double centPerpindicular,
CanvasString canvasString) {
hypothesisCanvas.write(
new SimplePoint(relation.getDomain().getLineBounds().getLowerBound() - 5 * centPerpindicular,
parallelOffset - 2 * centParallel),
canvasString);
}
};
public void draw(GraphCanvas hypothesisCanvas, ScalarRelation relation) {
if (!getAxis(relation).isVisibleAxis()) {
return;
}
LineBounds parallelBounds = getAxis(relation).getLineBounds();
LineBounds perpindicularBounds = getPerpindicularAxis(relation).getLineBounds();
double centParallel = parallelBounds.getLength() / 100;
double centPerpindicular = perpindicularBounds.getLength() / 100;
for (AxisSample axisSample : parallelBounds.getAxisSamples(false)) {
double parallelOffset = axisSample.getValue();
drawPerpindicularLine(hypothesisCanvas,
parallelOffset,
perpindicularBounds.getLowerBound() - centPerpindicular,
perpindicularBounds.getLowerBound() + centPerpindicular);
}
hypothesisCanvas.pushStyle(SimpleStyle.PLAIN);
for (AxisSample axisSample : parallelBounds.getAxisSamples(true)) {
double parallelOffset = axisSample.getValue();
drawPerpindicularLine(hypothesisCanvas,
parallelOffset,
perpindicularBounds.getLowerBound() - centPerpindicular,
perpindicularBounds.getLowerBound() + centPerpindicular);
write(hypothesisCanvas, relation, parallelOffset, centParallel, centPerpindicular, axisSample.getLabel());
}
hypothesisCanvas.popStyle();
}
protected abstract void write(GraphCanvas hypothesisCanvas, ScalarRelation relation,
double parallelOffset,
double centParallel, double centPerpindicular,
CanvasString canvasString);
protected abstract void drawPerpindicularLine(GraphCanvas canvas,
double parallelOffset, double perpindicularOffset1, double perpindicularOffset2);
protected abstract Axis getAxis(ScalarRelation relation);
protected abstract Axis getPerpindicularAxis(ScalarRelation relation);
}
|