using System;
using Core.Gis.GeoApi.Geometries;
namespace Core.GIS.NetTopologySuite.GeometriesGraph
{
///
/// Utility functions for working with quadrants, which are numbered as follows:
///
/// 1 | 0
/// --+--
/// 2 | 3
///
///
public class QuadrantOp
{
///
/// Only static methods!
///
private QuadrantOp() {}
///
/// Returns the quadrant of a directed line segment (specified as x and y
/// displacements, which cannot both be 0).
///
///
///
public static int Quadrant(double dx, double dy)
{
if (dx == 0.0 && dy == 0.0)
{
throw new ArgumentException("Cannot compute the quadrant for point ( " + dx + ", " + dy + " )");
}
if (dx >= 0)
{
if (dy >= 0)
{
return 0;
}
else
{
return 3;
}
}
else
{
if (dy >= 0)
{
return 1;
}
else
{
return 2;
}
}
}
///
/// Returns the quadrant of a directed line segment from p0 to p1.
///
///
///
public static int Quadrant(ICoordinate p0, ICoordinate p1)
{
double dx = p1.X - p0.X;
double dy = p1.Y - p0.Y;
if (dx == 0.0 && dy == 0.0)
{
throw new ArgumentException("Cannot compute the quadrant for two identical points " + p0);
}
return Quadrant(dx, dy);
}
///
/// Returns true if the quadrants are 1 and 3, or 2 and 4.
///
///
///
public static bool IsOpposite(int quad1, int quad2)
{
if (quad1 == quad2)
{
return false;
}
int diff = (quad1 - quad2 + 4)%4;
// if quadrants are not adjacent, they are opposite
if (diff == 2)
{
return true;
}
return false;
}
///
/// Returns the right-hand quadrant of the halfplane defined by the two quadrants,
/// or -1 if the quadrants are opposite, or the quadrant if they are identical.
///
///
///
public static int CommonHalfPlane(int quad1, int quad2)
{
// if quadrants are the same they do not determine a unique common halfplane.
// Simply return one of the two possibilities
if (quad1 == quad2)
{
return quad1;
}
int diff = (quad1 - quad2 + 4)%4;
// if quadrants are not adjacent, they do not share a common halfplane
if (diff == 2)
{
return -1;
}
int min = (quad1 < quad2) ? quad1 : quad2;
int max = (quad1 > quad2) ? quad1 : quad2;
// for this one case, the righthand plane is NOT the minimum index;
if (min == 0 && max == 3)
{
return 3;
}
// in general, the halfplane index is the minimum of the two adjacent quadrants
return min;
}
///
/// Returns whether the given quadrant lies within the given halfplane (specified
/// by its right-hand quadrant).
///
///
///
public static bool IsInHalfPlane(int quad, int halfPlane)
{
if (halfPlane == 3)
{
return quad == 3 || quad == 0;
}
return quad == halfPlane || quad == halfPlane + 1;
}
///
/// Returns true if the given quadrant is 0 or 1.
///
///
public static bool IsNorthern(int quad)
{
return quad == 0 || quad == 1;
}
}
}