package com.revolsys.geometry.test.old.noding; import com.revolsys.geometry.model.Point; import com.revolsys.geometry.model.impl.PointDoubleXY; import com.revolsys.geometry.model.segment.LineSegment; import com.revolsys.geometry.model.segment.LineSegmentDouble; import com.revolsys.geometry.noding.Octant; import com.revolsys.geometry.noding.SegmentPointComparator; import com.revolsys.util.number.Doubles; import junit.framework.TestCase; /** * Test IntersectionSegment#compareNodePosition using an exhaustive set * of test cases * * @version 1.7 */ public class SegmentPointComparatorFullTest extends TestCase { public static void main(final String[] args) { junit.textui.TestRunner.run(SegmentPointComparatorFullTest.class); } public SegmentPointComparatorFullTest(final String name) { super(name); } private void checkNodePosition(final LineSegment seg, final Point p0, final Point p1, final int expectedPositionValue) { final int octant = Octant.octant(seg.getP0(), seg.getP1()); final int posValue = SegmentPointComparator.compare(octant, p0, p1); // System.out.println(octant + " " + p0 + " " + p1 + " " + posValue); assertTrue(posValue == expectedPositionValue); } private void checkPointsAtDistance(final LineSegment seg, final double dist0, final double dist1) { final Point p0 = computePoint(seg, dist0); final Point p1 = computePoint(seg, dist1); if (p0.equals(p1)) { checkNodePosition(seg, p0, p1, 0); } else { checkNodePosition(seg, p0, p1, -1); checkNodePosition(seg, p1, p0, 1); } } private void checkSegment(final double x, final double y) { final Point seg0 = new PointDoubleXY(0, 0); final Point seg1 = new PointDoubleXY(x, y); final LineSegment seg = new LineSegmentDouble(seg0, seg1); for (int i = 0; i < 4; i++) { final double dist = i; final double gridSize = 1; checkPointsAtDistance(seg, dist, dist + 1.0 * gridSize); checkPointsAtDistance(seg, dist, dist + 2.0 * gridSize); checkPointsAtDistance(seg, dist, dist + 3.0 * gridSize); checkPointsAtDistance(seg, dist, dist + 4.0 * gridSize); } } private Point computePoint(final LineSegment seg, final double dist) { final double dx = seg.getP1().getX() - seg.getP0().getX(); final double dy = seg.getP1().getY() - seg.getP0().getY(); final double len = seg.getLength(); final Point pt = new PointDoubleXY(Doubles.makePrecise(1.0, dist * dx / len), Doubles.makePrecise(1.0, dist * dy / len)); return pt; } public void testQuadrant0() { checkSegment(100, 0); checkSegment(100, 50); checkSegment(100, 100); checkSegment(100, 150); checkSegment(0, 100); } public void testQuadrant1() { checkSegment(-100, 0); checkSegment(-100, 50); checkSegment(-100, 100); checkSegment(-100, 150); } public void testQuadrant2() { checkSegment(-100, 0); checkSegment(-100, -50); checkSegment(-100, -100); checkSegment(-100, -150); } public void testQuadrant4() { checkSegment(100, -50); checkSegment(100, -100); checkSegment(100, -150); checkSegment(0, -100); } }