/// <summary> /// 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. /// </summary> /// <param name="quad1"></param> /// <param name="quad2"></param> public static Quadrant CommonHalfPlane(Quadrant quad1, Quadrant 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.Value - quad2.Value + 4) % 4; // if quadrants are not adjacent, they do not share a common halfplane if (diff == 2) { return(Quadrant.Undefined); } var min = (quad1 < quad2) ? quad1 : quad2; var max = (quad1 > quad2) ? quad1 : quad2; // for this one case, the righthand plane is NOT the minimum index; if (min == NW && max == Quadrant.SW) { return(Quadrant.SW); } // in general, the halfplane index is the minimum of the two adjacent quadrants return(min); }
/// <summary> /// Returns whether this quadrant lies within the given halfplane (specified /// by its right-hand quadrant). /// </summary> /// <param name="halfPlane"></param> public bool IsInHalfPlane(Quadrant halfPlane) { if (halfPlane == SE) { return(this == SE || this == SW); } return(this == halfPlane || Value == halfPlane.Value + 1); }
/// <summary> /// Returns true if the quadrants are 1 and 3, or 2 and 4. /// </summary> /// <param name="quad">A quadrant</param> public bool IsOpposite(Quadrant quad) { if (this == quad) { return(false); } int diff = (Value - quad.Value + 4) % 4; // if quadrants are not adjacent, they are opposite if (diff == 2) { return(true); } return(false); }