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);
}