public FltInterval Intersect(FltInterval interval) { if (interval.IsEmpty()) { return(m_Empty); } if (IsEmpty()) { return(this); } // 3 if (interval.m_Min <= m_Min && interval.m_Max >= m_Max) { return(this); } // 1, 6 : completely before or after if ((interval.m_Max < m_Min) || (interval.m_Min > m_Max)) { return(m_Empty); } // 2, 4, 5 double min = Math.Max(m_Min, interval.m_Min); double max = Math.Min(m_Max, interval.m_Max); return(new FltInterval(min, max)); }
public FltInterval Union(FltInterval interval) { if (interval.IsEmpty()) { return(this); } if (IsEmpty()) { return(interval); } if (interval.Contains(this)) { return(interval); } if (Contains(interval)) { return(this); } double min = Math.Min(m_Min, interval.m_Min); double max = Math.Max(m_Max, interval.m_Max); return(new FltInterval(min, max)); }
public FltInterval Subtract(FltInterval interval) { if (IsEmpty() || interval.IsEmpty()) { return(m_Empty); } return(new FltInterval(m_Min - interval.Max, m_Max - interval.Min)); }
public FltInterval Add(FltInterval interval) { if (IsEmpty() || interval.IsEmpty()) { return(m_Empty); } return(new FltInterval(m_Min + interval.Min, m_Max + interval.Max)); }
static bool InZero(FltInterval interval) { if (interval.IsEmpty()) { return(false); } return((!(interval.Min > 0)) && (!(interval.Max < 0))); }
public bool IntersectsWith(FltInterval interval) { if (IsEmpty() || interval.IsEmpty()) { return(false); } return((interval.m_Min <= m_Max) && (interval.m_Max >= m_Min)); }
public bool Contains(FltInterval interval) { if (IsEmpty() || interval.IsEmpty()) { return(false); } return((interval.m_Min >= m_Min) && (interval.m_Max <= m_Max)); }
public FltInterval Difference(FltInterval interval) { if (interval.IsEmpty()) { return(this); } if (IsEmpty()) { return(this); } // 4 : cannot divide into two intervals... if ((interval.m_Min > m_Min) && (interval.m_Max < m_Max)) { return(this); } // 1, 6 : completely before or after if ((interval.m_Max < m_Min) || (interval.m_Min > m_Max)) { return(this); } // 3 : completely remove interval => empty if (interval.Contains(this)) { return(m_Empty); } // 2 : left overlap if (IntersectsWith(interval) && (interval.m_Max < m_Max)) { double min = Epsilon.Next(interval.m_Max); double max = m_Max; return(new FltInterval(min, max)); } // 5 : right overlap if (IntersectsWith(interval) && (interval.m_Min > m_Min)) { double min = m_Min; double max = Epsilon.Prev(interval.m_Min); return(new FltInterval(min, max)); } return(m_Empty); }
public static FltInterval Divide1(FltInterval lhs, FltInterval rhs, ref bool b) { b = false; if (lhs.IsEmpty() || rhs.IsEmpty()) { return(m_Empty); } if (InZero(rhs)) { if (rhs.Min != 0) { if (rhs.Max != 0) { return(DivideZeroPart1(lhs, rhs, ref b)); } else { return(DivideNegative(lhs, rhs.Min)); } } else { if (rhs.Max != 0) { return(DividePositive(lhs, rhs.Max)); } else { return(m_Empty); } } } else { return(DivideNonZero(lhs, rhs)); } }
public FltInterval Divide(FltInterval interval) { if (IsEmpty() || interval.IsEmpty()) { return(m_Empty); } if (InZero(interval)) { if (interval.Min != 0) { if (interval.Max != 0) { return(DivideZero(this)); } else { return(DivideNegative(this, interval.Min)); } } else { if (interval.Max != 0) { return(DividePositive(this, interval.Max)); } else { return(m_Empty); } } } else { return(DivideNonZero(this, interval)); } }
public FltInterval Multiply(FltInterval interval) { if (IsEmpty() || interval.IsEmpty()) { return(m_Empty); } double intvMin = interval.Min; double intvMax = interval.Max; if (m_Min < 0) { if (m_Max > 0) { if (intvMin < 0) { if (intvMax > 0) // M * M { return(new FltInterval(Math.Min(m_Min * intvMax, m_Max * intvMin), Math.Max(m_Min * intvMin, m_Max * intvMax))); } else // M * N { return(new FltInterval(m_Max * intvMin, m_Min * intvMin)); } } else { if (intvMax > 0) // M * P { return(new FltInterval(m_Min * intvMax, m_Max * intvMax)); } else // M * Z { return(m_Zero); } } } else { if (intvMin < 0) { if (intvMax > 0) // N * M { return(new FltInterval(m_Min * intvMax, m_Min * intvMin)); } else // N * N { return(new FltInterval(m_Max * intvMax, m_Min * intvMin)); } } else { if (intvMax > 0) // N * P { return(new FltInterval(m_Min * intvMax, m_Max * intvMin)); } else // N * Z { return(m_Zero); } } } } else { if (m_Max > 0) { if (intvMin < 0) { if (intvMax > 0) // P * M { return(new FltInterval(m_Max * intvMin, m_Max * intvMax)); } else // P * N { return(new FltInterval(m_Max * intvMin, m_Min * intvMax)); } } else { if (intvMax > 0) // P * P { return(new FltInterval(m_Min * intvMin, m_Max * intvMax)); } else // P * Z { return(m_Zero); } } } else // Z * ? { return(m_Zero); } } }