/* * Geotoolkit.org - An Open Source Java GIS Toolkit * http://www.geotoolkit.org * * (C) 2009-2012, Geomatys * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package org.geotoolkit.index.tree; import java.util.Arrays; import org.junit.Test; import static org.junit.Assert.*; import static org.geotoolkit.internal.tree.TreeUtilities.*; import org.junit.Assert; /** * Test {@link DefaultTreeUtils} methods. * * @author Remi Marechal (Geomatys) */ public class TreeUtilitiesTest extends org.geotoolkit.test.TestBase { private static final double EPSILON = 1E-12; public TreeUtilitiesTest() { } /** * Test minimum, maximum and median on envelope. */ @Test public void getPointsTest() { final double[] expectedResult = new double[3]; final double[] envelope = new double[]{-3, 2, 0, 1, 4, 0}; //lower corner System.arraycopy(envelope, 0, expectedResult, 0, 3); assertTrue(Arrays.equals(expectedResult, getLowerCorner(envelope))); //upper corner System.arraycopy(envelope, 3, expectedResult, 0, 3); assertTrue(Arrays.equals(expectedResult, getUpperCorner(envelope))); //median expectedResult[0] = -1; expectedResult[1] = 3; expectedResult[2] = 0; assertTrue(Arrays.equals(expectedResult, getMedian(envelope))); } /** * Test minimum, maximum and median on each envelope dimension. */ @Test public void getValuesTest() { final double[] envelope = new double[]{-3, 2, 0, 1, 4, 0}; //mins assertTrue(envelope[0] == getMinimum(envelope, 0)); assertTrue(envelope[1] == getMinimum(envelope, 1)); assertTrue(envelope[2] == getMinimum(envelope, 2)); //maxs assertTrue(envelope[3] == getMaximum(envelope, 0)); assertTrue(envelope[4] == getMaximum(envelope, 1)); assertTrue(envelope[5] == getMaximum(envelope, 2)); //spans assertTrue(4 == getSpan(envelope, 0)); assertTrue(2 == getSpan(envelope, 1)); assertTrue(0 == getSpan(envelope, 2)); } /** * Test contains. */ @Test public void containsTest(){ final double[] envelopeA = new double[6]; final double[] envelopeB = new double[6]; final double[] point = new double[3]; //touch envelopeA[0] = -4;envelopeA[3] = 3; envelopeA[1] = -6;envelopeA[4] = 2; envelopeA[2] = -3;envelopeA[5] = 1; envelopeB[0] = 0;envelopeB[3] = 3; envelopeB[1] = 1;envelopeB[4] = 2; envelopeB[2] = -2;envelopeB[5] = 1; assertTrue(contains(envelopeA, envelopeB, true)); assertFalse(contains(envelopeA, envelopeB, false)); //8th corners contains point test point[0] = -4; point[1] = -6; point[2] = -3; assertTrue(contains(envelopeA, point)); point[0] = 3; point[1] = -6; point[2] = -3; assertTrue(contains(envelopeA, point)); point[0] = 3; point[1] = 2; point[2] = -3; assertTrue(contains(envelopeA, point)); point[0] = -4; point[1] = 2; point[2] = -3; assertTrue(contains(envelopeA, point)); point[0] = -4; point[1] = -6; point[2] = 1; assertTrue(contains(envelopeA, point)); point[0] = 3; point[1] = -6; point[2] = 1; assertTrue(contains(envelopeA, point)); point[0] = 3; point[1] = 2; point[2] = 1; assertTrue(contains(envelopeA, point)); point[0] = -4; point[1] = 2; point[2] = 1; assertTrue(contains(envelopeA, point)); envelopeB[0] = 3;envelopeB[3] = 4; envelopeB[1] = 2;envelopeB[4] = 5; envelopeB[2] = 1;envelopeB[5] = 6; assertFalse(contains(envelopeA, envelopeB, true)); assertFalse(contains(envelopeA, envelopeB, false)); } /** * Test touches. */ @Test public void touchesTest(){ final double[] envelopeA = new double[4]; final double[] envelopeB = new double[4]; //touch 2D envelopeA[0] = -4; envelopeA[2] = 3; envelopeA[1] = -6; envelopeA[3] = 2; envelopeB[0] = 3; envelopeB[2] = 10; envelopeB[1] = 1; envelopeB[3] = 4; assertTrue(intersects(envelopeA, envelopeB, true)); assertFalse(intersects(envelopeA, envelopeB, false)); assertTrue(touches(envelopeA, envelopeB)); envelopeB[0] = 1; envelopeB[2] = 1; envelopeB[1] = 0; envelopeB[3] = 5; assertFalse(touches(envelopeA, envelopeB)); envelopeB[0] = 3; envelopeB[2] = 3; envelopeB[1] = 0; envelopeB[3] = 5; assertTrue(touches(envelopeA, envelopeB)); envelopeB[0] = -4; envelopeB[2] = -4; envelopeB[1] = 0; envelopeB[3] = 5; assertTrue(touches(envelopeA, envelopeB)); envelopeB[0] = -5; envelopeB[2] = 4; envelopeB[1] = -6; envelopeB[3] = -6; assertTrue(touches(envelopeA, envelopeB)); envelopeB[0] = -5; envelopeB[2] = 4; envelopeB[1] = 2; envelopeB[3] = 2; assertTrue(touches(envelopeA, envelopeB)); envelopeB[0] = -5; envelopeB[2] = 4; envelopeB[1] = 1; envelopeB[3] = 1; assertFalse(touches(envelopeA, envelopeB)); } /** * Test intersection. */ @Test public void intersectsTest(){ final double[] envelopeA = new double[6]; final double[] envelopeB = new double[6]; //touch envelopeA[0] = -4; envelopeA[3] = 3; envelopeA[1] = -6; envelopeA[4] = 2; envelopeA[2] = -3; envelopeA[5] = 1; envelopeB[0] = 3; envelopeB[3] = 4; envelopeB[1] = -6; envelopeB[4] = 5; envelopeB[2] = -3; envelopeB[5] = 1; assertTrue(intersects(envelopeA, envelopeB, true)); assertFalse(intersects(envelopeA, envelopeB, false)); //on 8th corners envelopeB[0] = -5; envelopeB[3] = -4; envelopeB[1] = -7; envelopeB[4] = -6; envelopeB[2] = -4; envelopeB[5] = -3; assertTrue(intersects(envelopeA, envelopeB, true)); assertFalse(intersects(envelopeA, envelopeB, false)); envelopeB[0] = 3; envelopeB[3] = 5; envelopeB[1] = -7; envelopeB[4] = -6; envelopeB[2] = -4; envelopeB[5] = -3; assertTrue(intersects(envelopeA, envelopeB, true)); assertFalse(intersects(envelopeA, envelopeB, false)); envelopeB[0] = 3; envelopeB[3] = 5; envelopeB[1] = 2; envelopeB[4] = 7; envelopeB[2] = -4; envelopeB[5] = -3; assertTrue(intersects(envelopeA, envelopeB, true)); assertFalse(intersects(envelopeA, envelopeB, false)); envelopeB[0] = -5; envelopeB[3] = -4; envelopeB[1] = 2; envelopeB[4] = 4; envelopeB[2] = -4; envelopeB[5] = -3; assertTrue(intersects(envelopeA, envelopeB, true)); assertFalse(intersects(envelopeA, envelopeB, false)); envelopeB[0] = -5; envelopeB[3] = -4; envelopeB[1] = -7; envelopeB[4] = -6; envelopeB[2] = 1; envelopeB[5] = 3; assertTrue(intersects(envelopeA, envelopeB, true)); assertFalse(intersects(envelopeA, envelopeB, false)); envelopeB[0] = 3; envelopeB[3] = 5; envelopeB[1] = -7; envelopeB[4] = -6; envelopeB[2] = 1; envelopeB[5] = 3; assertTrue(intersects(envelopeA, envelopeB, true)); assertFalse(intersects(envelopeA, envelopeB, false)); envelopeB[0] = 3; envelopeB[3] = 5; envelopeB[1] = 2; envelopeB[4] = 7; envelopeB[2] = 1; envelopeB[5] = 3; assertTrue(intersects(envelopeA, envelopeB, true)); assertFalse(intersects(envelopeA, envelopeB, false)); envelopeB[0] = -5; envelopeB[3] = -4; envelopeB[1] = 2; envelopeB[4] = 4; envelopeB[2] = 1; envelopeB[5] = 3; assertTrue(intersects(envelopeA, envelopeB, true)); assertFalse(intersects(envelopeA, envelopeB, false)); //contains envelopeB[0] = -2; envelopeB[3] = 1; envelopeB[1] = -5; envelopeB[4] = 0; envelopeB[2] = -2; envelopeB[5] = -1; assertTrue(intersects(envelopeA, envelopeB, true)); assertTrue(intersects(envelopeA, envelopeB, false)); //out envelopeB[0] = -10; envelopeB[3] = -9; envelopeB[1] = 50; envelopeB[4] = 70; envelopeB[2] = -100; envelopeB[5] = 100; assertFalse(intersects(envelopeA, envelopeB, true)); assertFalse(intersects(envelopeA, envelopeB, false)); } /** * Test union. */ @Test public void addTest() { final double[] envelopeA = new double[6]; final double[] envelopeB = new double[6]; //add same envelopeA[0] = -10; envelopeA[3] = 9; envelopeA[1] = 2; envelopeA[4] = 7; envelopeA[2] = -15; envelopeA[5] = -5; final double[] result = envelopeA.clone(); assertTrue(Arrays.equals(result, add(envelopeA, envelopeA.clone()))); System.arraycopy(result, 0, envelopeA, 0, result.length); //add lesser envelopeB[0] = -7; envelopeB[3] = 2; envelopeB[1] = 4; envelopeB[4] = 6; envelopeB[2] = -12; envelopeB[5] = -7; assertTrue(Arrays.equals(result, add(envelopeA, envelopeB))); //add bigger //add lesser envelopeB[0] = -17; envelopeB[3] = 29; envelopeB[1] = -3; envelopeB[4] = 10; envelopeB[2] = -21; envelopeB[5] = -1; assertTrue(Arrays.equals(envelopeB, add(envelopeA, envelopeB))); //add distincts System.arraycopy(result, 0, envelopeA, 0, result.length); envelopeB[0] = -25; envelopeB[3] = -17; envelopeB[1] = 75; envelopeB[4] = 82; envelopeB[2] = -125; envelopeB[5] = -42; assertTrue(Arrays.equals(new double[]{-25, 2, -125, 9, 82, -5}, add(envelopeA, envelopeB))); } /** * Test distance computing between point -> point or boundary -> point or boundary -> boundary. */ @Test public void getDistancesTest() { final double[] pointA = new double[3]; final double[] pointB = new double[3]; double result; //points //A->B pointA[0] = -4; pointA[1] = -6; pointA[2] = -3; pointB[0] = 2; pointB[1] = 3; pointB[2] = 4; result = Math.sqrt(166); Assert.assertEquals("getDistanceBetween2Envelopes : A -> B", result, getDistanceBetween2Positions(pointA, pointB), EPSILON); //b->A Assert.assertEquals("getDistanceBetween2Envelopes : B -> A", result, getDistanceBetween2Positions(pointB, pointA), EPSILON); final double[] envelopeA = new double[6]; final double[] envelopeB = new double[6]; //envelopes //A->B envelopeA[0] = -6; envelopeA[3] = -2; envelopeA[1] = -12; envelopeA[4] = 0; envelopeA[2] = -3.5; envelopeA[5] = -2.5; envelopeB[0] = 1; envelopeB[3] = 3; envelopeB[1] = 0; envelopeB[4] = 6; envelopeB[2] = 3.5; envelopeB[5] = 4.5; Assert.assertEquals("getDistanceBetween2Envelopes : A -> B", result, getDistanceBetween2Envelopes(envelopeA, envelopeB), EPSILON); //b->A Assert.assertEquals("getDistanceBetween2Envelopes : B -> A", result, getDistanceBetween2Envelopes(envelopeB, envelopeA), EPSILON); } /** * Test bulk, edge and perimeter computing. */ @Test public void computeSpaceTest() { //2D test double[] envelopeA = new double[4]; double[] envelopeB = new double[4]; envelopeA[0] = -6; envelopeA[2] = 2; envelopeA[1] = -2; envelopeA[3] = 7; //edge Assert.assertEquals("computeSpaceTest : get edge (perimeter)", 34, getPerimeter(envelopeA), EPSILON); //area Assert.assertEquals("computeSpaceTest : get area", 72, getArea(envelopeA), EPSILON); //bulk try { getBulk(envelopeA); Assert.fail("test should had fail"); } catch (Exception ex) { //ok } //overlaps envelopeB[0] = 0; envelopeB[2] = 4; envelopeB[1] = 3; envelopeB[3] = 10; Assert.assertEquals("computeSpaceTest : getOverlaps", 8, getOverlapValue(envelopeA, envelopeB), EPSILON); Assert.assertEquals("computeSpaceTest : getOverlaps", 8, getOverlapValue(envelopeB, envelopeA), EPSILON); assertEquals("computeSpaceTest : getOverlaps with intersection", 8, getArea(intersect(envelopeA, envelopeB)), EPSILON); //3D+ test envelopeA = new double[6]; envelopeB = new double[6]; envelopeA[0] = -6; envelopeA[3] = 2; envelopeA[1] = -2; envelopeA[4] = 7; envelopeA[2] = -9; envelopeA[5] = 5; //area Assert.assertEquals("computeSpaceTest : get area", 620, getArea(envelopeA), EPSILON); //bulk Assert.assertEquals("computeSpaceTest : get bulk", 1008, getBulk(envelopeA), EPSILON); //overlaps envelopeB[0] = 0; envelopeB[3] = 4; envelopeB[1] = 3; envelopeB[4] = 10; envelopeB[2] = -2; envelopeB[5] = 3; Assert.assertEquals("computeSpaceTest : getOverlaps", 40, getOverlapValue(envelopeA, envelopeB), EPSILON); Assert.assertEquals("computeSpaceTest : getOverlaps", 40, getOverlapValue(envelopeB, envelopeA), EPSILON); assertEquals("computeSpaceTest : getOverlaps with intersection", 40, getBulk(intersect(envelopeA, envelopeB)), EPSILON); } }