package org.osm2world.core.math;
import static org.junit.Assert.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.junit.Test;
public class PolygonXZTest {
private static final VectorXZ outlineA0 = new VectorXZ(-1.1f, -1.1f);
private static final VectorXZ outlineA1 = new VectorXZ(-1.1f, 1.1f);
private static final VectorXZ outlineA2 = new VectorXZ(1.1f, 1.1f);
private static final VectorXZ outlineA3 = new VectorXZ(1.1f, -1.1f);
private static final VectorXZ outlineA4 = new VectorXZ(0f, 1f);
private static final List<VectorXZ> outlineA = Arrays.asList(outlineA0,
outlineA1, outlineA2, outlineA3, outlineA0);
private static final List<VectorXZ> outlineB = Arrays.asList(outlineA0,
outlineA1, outlineA2, outlineA3, outlineA4, outlineA0);
@Test
public void testIsClockwise1() {
assertTrue(new SimplePolygonXZ(outlineA).isClockwise());
List<VectorXZ> outlineAInv = new ArrayList<VectorXZ>(outlineA);
Collections.reverse(outlineAInv);
assertFalse(new SimplePolygonXZ(outlineAInv).isClockwise());
}
@Test
public void testIsClockwise2() {
assertTrue(new SimplePolygonXZ(outlineB).isClockwise());
List<VectorXZ> outlineBInv = new ArrayList<VectorXZ>(outlineB);
Collections.reverse(outlineBInv);
assertFalse(new SimplePolygonXZ(outlineBInv).isClockwise());
}
@Test
public void testIsClockwise3() {
// test case created from a former bug
assertTrue(new SimplePolygonXZ(Arrays.asList(
new VectorXZ(114266.61f,12953.262f),
new VectorXZ(114258.74f,12933.117f),
new VectorXZ(114257.69f,12939.848f),
new VectorXZ(114266.61f,12953.262f))).isClockwise());
}
@Test
public void testIsEquivalentTo_same() {
PolygonXZ polyA = new PolygonXZ(outlineA);
assertTrue(polyA.isEquivalentTo(polyA));
}
@Test
public void testIsEquivalentTo_yes() {
assertTrue(
new PolygonXZ(Arrays.asList(outlineA0, outlineA1, outlineA4, outlineA0))
.isEquivalentTo(
new PolygonXZ(Arrays.asList(outlineA1, outlineA4, outlineA0, outlineA1))));
}
@Test
public void testIsEquivalentTo_no() {
assertFalse(
new PolygonXZ(Arrays.asList(outlineA0, outlineA1, outlineA4, outlineA0))
.isEquivalentTo(
new PolygonXZ(Arrays.asList(outlineA0, outlineA4, outlineA1, outlineA0))));
}
@Test
public void testIsSelfIntersecting1() {
VectorXZ v1 = new VectorXZ(0, 0);
VectorXZ v2 = new VectorXZ(1, 0);
VectorXZ v3 = new VectorXZ(1, 1);
VectorXZ v4 = new VectorXZ(0, 1);
VectorXZ v5 = new VectorXZ(0, 0);
// Simple rectangle should not be self intersecting
assertFalse(
new PolygonXZ(Arrays.asList(v1, v2, v3, v4, v5)).isSelfIntersecting());
}
@Test
public void testIsSelfIntersecting2() {
VectorXZ v1 = new VectorXZ(1, 5);
VectorXZ v2 = new VectorXZ(5, 2);
VectorXZ v3 = new VectorXZ(4, 1);
VectorXZ v4a = new VectorXZ(3, 4);
VectorXZ v4b = new VectorXZ(3, 5);
VectorXZ v4c = new VectorXZ(3, 6);
VectorXZ v5 = new VectorXZ(1, 5);
/*
* testing a simple self intersecting polygon with 4 vertices
* while the line causing the intersection is above, below or at the
* same height as the beginning node
*/
assertTrue(
new PolygonXZ(Arrays.asList(v1, v2, v3, v4a, v5)).isSelfIntersecting());
assertTrue(
new PolygonXZ(Arrays.asList(v1, v2, v3, v4b, v5)).isSelfIntersecting());
assertTrue(
new PolygonXZ(Arrays.asList(v1, v2, v3, v4c, v5)).isSelfIntersecting());
}
@Test
public void testIsSelfIntersecting3() {
VectorXZ v1 = new VectorXZ(0, 0);
VectorXZ v2 = new VectorXZ(10, 0);
VectorXZ v3 = new VectorXZ(15, 0);
VectorXZ v4 = new VectorXZ(20, 0);
VectorXZ v5 = new VectorXZ(20, 20);
VectorXZ v6 = new VectorXZ(0, 20);
VectorXZ v7 = new VectorXZ(0, 0);
// Testing simple non self intersecting polygons
// ... with one vertex is used two times
assertFalse(
new PolygonXZ(Arrays.asList(v1, v2, v2, v5, v6, v7)).isSelfIntersecting());
// ... with 3 parallel line segments
assertFalse(
new PolygonXZ(Arrays.asList(v1, v2, v3, v4, v5, v6, v7)).isSelfIntersecting());
// ... with 3 co-linear line segments
assertFalse(
new PolygonXZ(Arrays.asList(v1, v2, v4, v3, v4, v5, v6, v7)).isSelfIntersecting());
}
@Test
public void testIsSelfIntersecting4() {
VectorXZ v1 = new VectorXZ(0, 0);
VectorXZ v2 = new VectorXZ(0, 1);
VectorXZ v3 = new VectorXZ(0, 3);
VectorXZ v4 = new VectorXZ(0, 4);
VectorXZ v5 = new VectorXZ(2, 2);
VectorXZ v6 = new VectorXZ(4, 2);
// Testing simple polygons with two vertical line segments
// .. without any intersection
assertFalse(
new PolygonXZ(Arrays.asList(v1, v2, v5, v3, v4, v6, v1)).isSelfIntersecting());
// ... with one point being visited twice
assertFalse(
new PolygonXZ(Arrays.asList(v1, v2, v6, v3, v4, v6, v1)).isSelfIntersecting());
// .. with a intersection at the right side
assertTrue(
new PolygonXZ(Arrays.asList(v1, v2, v6, v3, v4, v5, v1)).isSelfIntersecting());
}
}