/*
* Copyright (c) 2016 Vivid Solutions.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Eclipse Distribution License v. 1.0 which accompanies this distribution.
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
*
* http://www.eclipse.org/org/documents/edl-v10.php.
*/
package org.locationtech.jts.noding;
import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.LineSegment;
import org.locationtech.jts.geom.PrecisionModel;
import junit.framework.TestCase;
/**
* Test IntersectionSegment#compareNodePosition using an exhaustive set
* of test cases
*
* @version 1.7
*/
public class SegmentPointComparatorFullTest
extends TestCase
{
private PrecisionModel pm = new PrecisionModel(1.0);
public SegmentPointComparatorFullTest(String name) {
super(name);
}
public static void main(String[] args) {
junit.textui.TestRunner.run(SegmentPointComparatorFullTest.class);
}
public void testQuadrant0()
{
checkSegment(100, 0);
checkSegment(100, 50);
checkSegment(100, 100);
checkSegment(100, 150);
checkSegment(0, 100);
}
public void testQuadrant4()
{
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);
}
private void checkSegment(double x, double y)
{
Coordinate seg0 = new Coordinate(0, 0);
Coordinate seg1 = new Coordinate(x, y);
LineSegment seg = new LineSegment(seg0, seg1);
for (int i = 0; i < 4; i++) {
double dist = i;
double gridSize = 1 / pm.getScale();
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 Coordinate computePoint(LineSegment seg, double dist)
{
double dx = seg.p1.x - seg.p0.x;
double dy = seg.p1.y - seg.p0.y;
double len = seg.getLength();
Coordinate pt = new Coordinate(dist * dx / len, dist * dy / len);
pm.makePrecise(pt);
return pt;
}
private void checkPointsAtDistance(LineSegment seg, double dist0, double dist1)
{
Coordinate p0 = computePoint(seg, dist0);
Coordinate 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 checkNodePosition(LineSegment seg, Coordinate p0, Coordinate p1, int expectedPositionValue)
{
int octant = Octant.octant(seg.p0, seg.p1);
int posValue = SegmentPointComparator.compare(octant, p0, p1);
//System.out.println(octant + " " + p0 + " " + p1 + " " + posValue);
assertTrue(posValue == expectedPositionValue);
}
}