blob: 51e3de46fd8839d677b57d87b9586f22da7f04fa [file] [log] [blame]
/*
* Copyright 2005 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.common.geometry;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.logging.Logger;
public strictfp class S2RegionCovererTest extends GeometryTestCase {
private static Logger logger = Logger.getLogger(S2RegionCovererTest.class.getName());
public void testRandomCells() {
logger.info("TestRandomCells");
S2RegionCoverer coverer = new S2RegionCoverer();
coverer.setMaxCells(1);
// Test random cell ids at all levels.
for (int i = 0; i < 10000; ++i) {
S2CellId id = getRandomCellId();
S2CellUnion covering = new S2CellUnion();
coverer.getCovering(new S2Cell(id), covering.cellIds());
assertEquals(covering.size(), 1);
assertEquals(covering.cellId(0), id);
}
}
public void checkCovering(
S2RegionCoverer coverer, S2Region region, ArrayList<S2CellId> covering, boolean interior) {
// Keep track of how many cells have the same coverer.min_level() ancestor.
HashMap<S2CellId, Integer> minLevelCells = new HashMap<S2CellId, Integer>();
for (int i = 0; i < covering.size(); ++i) {
int level = covering.get(i).level();
assertTrue(level >= coverer.minLevel());
assertTrue(level <= coverer.maxLevel());
assertEquals((level - coverer.minLevel()) % coverer.levelMod(), 0);
S2CellId key = covering.get(i).parent(coverer.minLevel());
if (!minLevelCells.containsKey(key)) {
minLevelCells.put(key, 1);
} else {
minLevelCells.put(key, minLevelCells.get(key) + 1);
}
}
if (covering.size() > coverer.maxCells()) {
// If the covering has more than the requested number of cells, then check
// that the cell count cannot be reduced by using the parent of some cell.
for (Integer i : minLevelCells.values()) {
assertEquals(i.intValue(), 1);
}
}
if (interior) {
for (int i = 0; i < covering.size(); ++i) {
assertTrue(region.contains(new S2Cell(covering.get(i))));
}
} else {
S2CellUnion cellUnion = new S2CellUnion();
cellUnion.initFromCellIds(covering);
checkCovering(region, cellUnion, true, new S2CellId());
}
}
public void testRandomCaps() {
logger.info("TestRandomCaps");
final int kMaxLevel = S2CellId.MAX_LEVEL;
S2RegionCoverer coverer = new S2RegionCoverer();
for (int i = 0; i < 1000; ++i) {
do {
coverer.setMinLevel(random(kMaxLevel + 1));
coverer.setMaxLevel(random(kMaxLevel + 1));
} while (coverer.minLevel() > coverer.maxLevel());
coverer.setMaxCells(skewed(10));
coverer.setLevelMod(1 + random(3));
double maxArea = Math.min(
4 * S2.M_PI, (3 * coverer.maxCells() + 1) * S2Cell.averageArea(coverer.minLevel()));
S2Cap cap = getRandomCap(0.1 * S2Cell.averageArea(kMaxLevel), maxArea);
ArrayList<S2CellId> covering = new ArrayList<S2CellId>();
ArrayList<S2CellId> interior = new ArrayList<S2CellId>();
coverer.getCovering(cap, covering);
checkCovering(coverer, cap, covering, false);
coverer.getInteriorCovering(cap, interior);
checkCovering(coverer, cap, interior, true);
// Check that GetCovering is deterministic.
ArrayList<S2CellId> covering2 = new ArrayList<S2CellId>();
coverer.getCovering(cap, covering2);
assertTrue(covering.equals(covering2));
// Also check S2CellUnion.denormalize(). The denormalized covering
// may still be different and smaller than "covering" because
// S2RegionCoverer does not guarantee that it will not output all four
// children of the same parent.
S2CellUnion cells = new S2CellUnion();
cells.initFromCellIds(covering);
ArrayList<S2CellId> denormalized = new ArrayList<S2CellId>();
cells.denormalize(coverer.minLevel(), coverer.levelMod(), denormalized);
checkCovering(coverer, cap, denormalized, false);
}
}
public void testSimpleCoverings() {
logger.info("TestSimpleCoverings");
final int kMaxLevel = S2CellId.MAX_LEVEL;
S2RegionCoverer coverer = new S2RegionCoverer();
coverer.setMaxCells(Integer.MAX_VALUE);
for (int i = 0; i < 1000; ++i) {
int level = random(kMaxLevel + 1);
coverer.setMinLevel(level);
coverer.setMaxLevel(level);
double maxArea = Math.min(4 * S2.M_PI, 1000 * S2Cell.averageArea(level));
S2Cap cap = getRandomCap(0.1 * S2Cell.averageArea(kMaxLevel), maxArea);
ArrayList<S2CellId> covering = new ArrayList<S2CellId>();
S2RegionCoverer.getSimpleCovering(cap, cap.axis(), level, covering);
checkCovering(coverer, cap, covering, false);
}
}
}