package com.twotoasters.clusterkraf; import com.google.android.gms.maps.Projection; /** * Models the animated transition of a cluster */ class AnimatedTransition { private final ClusterPoint originClusterPoint; private final ClusterPoint originClusterRelevantInputPoints; private final ClusterPoint destinationClusterPoint; private final boolean spans180Meridian; AnimatedTransition(Projection projection, ClusterPoint originClusterPoint, InputPoint firstRelevantInputPointFromOriginClusterPoint, ClusterPoint destinationClusterPoint) { originClusterPoint.clearScreenPosition(); originClusterPoint.buildScreenPosition(projection); this.originClusterPoint = originClusterPoint; this.originClusterRelevantInputPoints = new ClusterPoint(firstRelevantInputPointFromOriginClusterPoint, projection, true, originClusterPoint.getMapPosition()); this.originClusterRelevantInputPoints.setScreenPosition(originClusterPoint.getScreenPosition()); this.destinationClusterPoint = destinationClusterPoint; this.spans180Meridian = Math.abs((originClusterPoint.getMapPosition().longitude) - (destinationClusterPoint.getMapPosition().longitude)) > 180; } boolean originContains(InputPoint point) { return originClusterPoint != null && originClusterPoint.containsInputPoint(point); } boolean destinationContains(InputPoint point) { return destinationClusterPoint != null && destinationClusterPoint.containsInputPoint(point); } ClusterPoint getOriginClusterRelevantInputPoints() { return originClusterRelevantInputPoints; } ClusterPoint getDestinationClusterPoint() { return destinationClusterPoint; } void addOriginClusterRelevantInputPoint(InputPoint previousInputPoint) { originClusterRelevantInputPoints.add(previousInputPoint); } /** * @return whether (true) or not (false) the origin and destination * longitudes are on opposite sides of the 180 meridian */ boolean spans180Meridian() { return spans180Meridian; } }