// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.plugins.graphview.core.visualisation;
import org.openstreetmap.josm.plugins.graphview.core.graph.GraphNode;
import org.openstreetmap.josm.plugins.graphview.core.transition.SegmentNode;
/**
* default strategy to place nodes.
* Will move every node whose SegmentNode is connected to more than two segments
* at most 1/3 of segment length away from the original position.
*/
public class DefaultNodePositioner implements NodePositioner {
@Override
public LatLonCoords getPosition(GraphNode node) {
SegmentNode segmentNode = node.getSegmentNode();
if (2 >= segmentNode.getInboundSegments().size()
+ segmentNode.getOutboundSegments().size()) {
return new LatLonCoords(
node.getSegmentNode().getLat(),
node.getSegmentNode().getLon());
} else {
SegmentNode node1 = node.getSegment().getNode1();
SegmentNode node2 = node.getSegment().getNode2();
assert segmentNode == node1 || segmentNode == node2;
LatLonCoords result;
if (segmentNode == node1) {
result = new LatLonCoords(
(2 * node1.getLat() + node2.getLat()) / 3,
(2 * node1.getLon() + node2.getLon()) / 3);
} else {
result = new LatLonCoords(
(node1.getLat() + 2 * node2.getLat()) / 3,
(node1.getLon() + 2 * node2.getLon()) / 3);
}
return result;
}
}
}