com.vividsolutions.jts.noding.SegmentPointComparator Maven / Gradle / Ivy
The newest version!
/*
* The JTS Topology Suite is a collection of Java classes that
* implement the fundamental operations required to validate a given
* geo-spatial data set to a known topological specification.
*
* Copyright (C) 2001 Vivid Solutions
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* For more information, contact:
*
* Vivid Solutions
* Suite #1A
* 2328 Government Street
* Victoria BC V8T 5G5
* Canada
*
* (250)385-6040
* www.vividsolutions.com
*/
package com.vividsolutions.jts.noding;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.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;
}
}