You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
137 lines
5.1 KiB
137 lines
5.1 KiB
/*
|
|
* 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);
|
|
}
|
|
}
|
|
}
|