/* * (c) Copyright 2010-2011 AgileBirds * * This file is part of OpenFlexo. * * OpenFlexo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenFlexo 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with OpenFlexo. If not, see <http://www.gnu.org/licenses/>. * */ package org.openflexo.fge.geom; import junit.framework.TestCase; import org.openflexo.fge.geom.FGEArc.ArcType; import org.openflexo.fge.geom.FGEGeometricObject.Filling; import org.openflexo.fge.geom.area.FGEArea; import org.openflexo.fge.geom.area.FGEEmptyArea; import org.openflexo.fge.geom.area.FGEUnionArea; public class TestArc extends TestCase { public void testEquals() { FGEArc arc1 = buildArc(0, 90); FGEArc arc2 = buildArc(0, 450); FGEArc arc3 = buildArc(360, 90); FGEArc arc4 = buildArc(360, 450); assertEquals(arc2, arc1); assertEquals(arc3, arc1); assertEquals(arc4, arc1); } public void testIntersect1() { FGEArc arc1 = buildArc(0, 90); FGEArc arc2 = buildArc(0, 45); assertEquals(arc2, arc1.intersect(arc2)); assertEquals(arc2, arc2.intersect(arc1)); } public void testIntersect2() { FGEArc arc1 = buildArc(-45, 45); FGEArc arc2 = buildArc(0, 90); assertEquals(buildArc(0, 45), arc1.intersect(arc2)); } public void testIntersect3() { FGEArc arc1 = buildArc(20, 45); FGEArc arc2 = buildArc(0, 90); assertEquals(arc1, arc1.intersect(arc2)); } public void testIntersect4() { FGEArc arc1 = buildArc(20, 90); FGEArc arc2 = buildArc(0, 45); assertEquals(buildArc(20, 45), arc1.intersect(arc2)); } public void testIntersect5() { FGEArc arc1 = buildArc(20, 180); FGEArc arc2 = buildArc(0, 225); FGEArc arc3 = buildArc(-340, 180); FGEArc arc4 = buildArc(360, 225); assertEquals(buildArc(20, 180), arc1.intersect(arc2)); assertEquals(buildArc(20, 180), arc4.intersect(arc3)); } public void testIntersect6() { FGEArc arc1 = buildArc(0, 180); FGEArc arc2 = buildArc(20, 110); assertEquals(arc2, arc1.intersect(arc2)); assertEquals(arc2, arc2.intersect(arc1)); } public void testIntersect7() { FGEArc arc1 = buildArc(0, 180); FGEArc arc2 = buildArc(170, 200); assertEquals(buildArc(170, -180), arc1.intersect(arc2)); assertEquals(buildArc(170, 180), arc2.intersect(arc1)); } public void testIntersect8() { FGEArc arc1 = buildArc(0, 180); FGEArc arc2 = buildArc(170, 370); assertEquals(new FGEUnionArea(buildArc(170, 180), buildArc(0, 10)), arc1.intersect(arc2)); assertEquals(new FGEUnionArea(buildArc(170, 180), buildArc(0, 10)), arc2.intersect(arc1)); } public void testIntersect9() { FGEArc arc1 = buildArc(20, 30); FGEArc arc2 = buildArc(30, 210); assertEquals(arc1.getPointAtAngle(30), arc1.intersect(arc2)); } public void testIntersect10() { FGEArc arc1 = buildArc(0, 180); FGEArc arc2 = buildArc(180, 0); assertEquals(new FGEUnionArea(new FGEPoint(0, 0.5), new FGEPoint(1, 0.5)), arc1.intersect(arc2)); } public void testIntersect11() { FGEArc arc1 = buildArc(30, 80); FGEArc arc2 = buildArc(90, 130); assertEquals(new FGEEmptyArea(), arc1.intersect(arc2)); } public void testIntersect12() { FGEArc arc1 = buildArc(30, 90); FGEArc arc2 = buildArc(-200, 80); assertEquals(new FGEEmptyArea(), arc1.intersect(arc2)); } public void testIntersect13() { FGEArc arc1 = buildEllips(); FGEArc arc2 = buildArc(0, 45); assertEquals(arc2, arc1.intersect(arc2)); assertEquals(arc2, arc2.intersect(arc1)); } // This test handle special cases of arcs starting or ending at 180°/-180° // Not a piece of cake public void testIntersect14() { FGEArc arc1 = buildEllips(); FGEArc arc2 = buildArc(90, 270); FGEArc arc3 = buildArc(90, 180); assertEquals(true, arc2.containsArea(arc3)); assertEquals(arc2, arc1.intersect(arc2)); assertEquals(arc2, arc2.intersect(arc1)); } public void testUnion1() { FGEArc arc1 = buildArc(0, 90); FGEArc arc2 = buildArc(10, 80); assertEquals(buildArc(0, 90), arc1.union(arc2)); } public void testUnion2() { FGEArc arc1 = buildArc(0, 90); FGEArc arc2 = buildArc(10, 100); assertEquals(buildArc(0, 100), arc1.union(arc2)); } public void testUnion3() { FGEArc arc1 = buildArc(0, 90); FGEArc arc2 = buildArc(90, 170); assertEquals(buildArc(0, 170), arc1.union(arc2)); } public void testUnion4() { FGEArc arc1 = buildArc(0, 90); FGEArc arc2 = buildArc(90, 200); assertEquals(buildArc(0, 200), arc1.union(arc2)); } public void testUnion5() { FGEArc arc1 = buildArc(0, 90); FGEArc arc2 = buildArc(90, 180); assertEquals(buildArc(0, 180), arc1.union(arc2)); } public void testUnion6() { FGEArc arc1 = buildArc(-100, 100); FGEArc arc2 = buildArc(90, 270); assertEquals(buildEllips(), arc1.union(arc2)); } public void testUnion7() { FGEArc arc1 = buildArc(0, 90); FGEArc arc2 = buildArc(90, 180); FGEArc arc3 = buildArc(-180, -90); FGEArc arc4 = buildArc(-90, 0); FGEArea result = FGEUnionArea.makeUnion(arc1, arc2, arc3, arc4); assertEquals(buildEllips(), result); } // This test handle special cases of arcs starting or ending at 180°/-180° // Not a piece of cake public void testUnion8() { FGEArc arc2 = buildArc(180, 0); FGEArc arc3 = buildArc(-180, 0); assertEquals(arc2, arc3); assertTrue(arc3.containsArea(arc2)); assertTrue(arc2.containsArea(arc3)); } public void testLineIntersection1() { FGEArc arc = buildArc(90, 270); FGELine line = new FGELine(new FGEPoint(0.5001, 0), new FGEPoint(0.5, 1)); System.out.println("arc=" + arc); System.out.println("line=" + line); System.out.println("arc.intersect(line)=" + arc.intersect(line)); } private FGEArc buildArc(double angleStart, double angleEnd) { return new FGEArc(0, 0, 1, 1, angleStart, Math.toDegrees(FGEArc.angleExtent(Math.toRadians(angleStart), Math.toRadians(angleEnd))), ArcType.OPEN); } private FGEArc buildEllips() { return new FGEEllips(0, 0, 1, 1, Filling.NOT_FILLED); } }