* @return 7 permuted path cases.
*/
private List<TantrixPath> findPermutedPaths(double radius) {
List<TantrixPath> permutedPaths = new ArrayList<TantrixPath>();
PathPivotPermuter permuter = new PathPivotPermuter(path);
TilePlacementList tiles = path.getTilePlacements();
int numTiles = path.size();
if (radius >= 0.4) {
for (int i = 1; i < numTiles - 1; i++) {
addAllPermutedPaths(permuter.findPermutedPaths(i, i), permutedPaths);
}
}
else if (radius >= 0.1) {
// to avoid trying too many paths, increment by something more than one if many tiles.
int inc = 1 + path.size()/4;
// n^2 * 7 permuted paths will be added.
for (int pivot1 = 1; pivot1 < numTiles-1; pivot1+=rand(inc)) {
for (int pivot2 = pivot1; pivot2 < numTiles-1; pivot2+=rand(inc)) {
addAllPermutedPaths(permuter.findPermutedPaths(pivot1, pivot2), permutedPaths);
}
}
}
else if (permutedPaths.isEmpty()) {
List<PathType> types = Arrays.asList(PathType.values());
Collections.shuffle(types, MathUtil.RANDOM);
Iterator<PathType> typeIter = types.iterator();
do {
SameTypeTileMixer mixer = new SameTypeTileMixer(typeIter.next(), path);
addAllPermutedPaths(mixer.findPermutedPaths(), permutedPaths);
} while (typeIter.hasNext());
}
// as a last resort use this without checking for it in the cache.
if (permutedPaths.isEmpty()) {
List<TantrixPath> paths;
do {
int pivotIndex1 = 1 + MathUtil.RANDOM.nextInt(tiles.size()-2);
int pivotIndex2 = 1 + MathUtil.RANDOM.nextInt(tiles.size()-2);
paths = permuter.findPermutedPaths(pivotIndex1, pivotIndex2);
System.out.println("paths unexpectedly empty! when p1="+pivotIndex1 + " p2="+ pivotIndex2);
} while (paths.isEmpty());
return paths;
}