summaryrefslogtreecommitdiff
path: root/java/src/org/singinst/uf/presenter/AxisDirection.java
blob: a6de1ddcb4acead5649546893053a2e8f7bf0734 (plain)
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);

}