SegmentPointComparator.java
/*
* 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 2.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-v20.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.util.Assert;
/**
* Implements a robust method of comparing the relative position of two
* points along the same segment.
* The coordinates are assumed to lie "near" the segment.
* This means that this algorithm will only return correct results
* if the input coordinates
* have the same precision and correspond to rounded values
* of exact coordinates lying on the segment.
*
* @version 1.7
*/
public class SegmentPointComparator {
/**
* Compares two {@link Coordinate}s for their relative position along a segment
* lying in the specified {@link Octant}.
*
* @return -1 node0 occurs first;
* 0 the two nodes are equal;
* 1 node1 occurs first
*/
public static int compare(int octant, Coordinate p0, Coordinate p1)
{
// nodes can only be equal if their coordinates are equal
if (p0.equals2D(p1)) return 0;
int xSign = relativeSign(p0.x, p1.x);
int ySign = relativeSign(p0.y, p1.y);
switch (octant) {
case 0: return compareValue(xSign, ySign);
case 1: return compareValue(ySign, xSign);
case 2: return compareValue(ySign, -xSign);
case 3: return compareValue(-xSign, ySign);
case 4: return compareValue(-xSign, -ySign);
case 5: return compareValue(-ySign, -xSign);
case 6: return compareValue(-ySign, xSign);
case 7: return compareValue(xSign, -ySign);
}
Assert.shouldNeverReachHere("invalid octant value");
return 0;
}
public static int relativeSign(double x0, double x1)
{
if (x0 < x1) return -1;
if (x0 > x1) return 1;
return 0;
}
private static int compareValue(int compareSign0, int compareSign1)
{
if (compareSign0 < 0) return -1;
if (compareSign0 > 0) return 1;
if (compareSign1 < 0) return -1;
if (compareSign1 > 0) return 1;
return 0;
}
}