using Newtonsoft.Json; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Misc { /// /// double范围类, /// public class RangeF : INotifyPropertyChanged { #region property /// /// 开始 /// public double Begin { get; set; } /// /// 结束 /// public double End { get; set; } #endregion #region just get property /// /// 本范围 中心位置 /// [JsonIgnore] public double Mid { get { if (IsValid) return (End + Begin) / 2; else return double.NaN; } } /// /// 本范围宽度 /// [JsonIgnore] public double Width { get { if (IsValid) return End - Begin; else return double.NaN; } } /// /// 是否有效 /// [JsonIgnore] public bool IsValid { get { if (!double.IsNaN(Begin) && !double.IsNaN(End)) return true; else return false; } } #endregion /// /// 使用无效值初始化 /// public RangeF() { Reset(); } #region methods /// /// 范围 r 在 本范围内 /// /// /// public bool Contain(RangeF r) { if ((Begin <= r.Begin) && (r.End <= End)) return true; else return false; } /// /// 点 p 在 本范围内 /// /// /// public bool Contain(double p) { if ((Begin <= p) && (p <= End)) return true; else return false; } /// /// 平移 /// /// public void Move(double offset) { Begin += offset; End += offset; } /// /// 复位为无效 /// public void Reset() { Begin = double.NaN; End = double.NaN; } /// /// 范围并集 /// /// /// /// public static RangeF operator |(RangeF a, RangeF b) { return new RangeF() { Begin = (a.Begin < b.Begin) ? a.Begin : b.Begin, End = (a.End > b.End) ? a.End : b.End }; } /// /// 范围交集 /// /// /// /// public static RangeF operator &(RangeF a, RangeF b) { RangeF r = new RangeF() { Begin = (a.Begin > b.Begin) ? a.Begin : b.Begin, End = (a.End < b.End) ? a.End : b.End }; if (r.End < r.Begin) { return new RangeF(); } else { return r; } } /// /// 范围 a小于b /// /// /// /// public static bool operator <(RangeF a, RangeF b) { if (a.End < b.Begin)//[a.b,a.e] [b.b,b.e] { return true; } else { return false; } } /// /// 范围 a大于b /// /// /// /// public static bool operator >(RangeF a, RangeF b) { if (b.End < (a.Begin))// [b.b,b.e][a.b,a.e] { return true; } else { return false; } } public static bool operator <(double p, RangeF r) { if (p < r.Begin) { return true; } else { return false; } } public static bool operator >(double p, RangeF r) { if (p > r.End) { return true; } else { return false; } } public static bool operator <(RangeF r, double p) { if (r.End < p) { return true; } else { return false; } } public static bool operator >(RangeF r, double p) { if (r.Begin > p) { return true; } else { return false; } } /// /// 是否有交集 /// /// /// public bool HasIntersection(RangeF r) { if (Contain(r.Begin)) return true; if (Contain(r.End)) return true; if (r.Contain(Begin)) return true; if (r.Contain(End)) return true; return false; } /// /// 可以合并 /// /// public bool CanUnion(RangeF r) { if (HasIntersection(r)) return true; if (End == (r.Begin - 1)) return true; if (Begin == (r.End + 1)) return true; return false; } /// /// 复制 r 的值到 本范围内 /// /// public void Copy(RangeF r) { Begin = r.Begin; End = r.End; } /// /// 克隆 /// /// public RangeF Clone() { RangeF r = new RangeF(); r.Copy(this); return r; } #endregion /// /// /// /// public override string ToString() { return "[" + Begin.ToString() + "," + End.ToString() + "]=" + Width.ToString(); } #region INotifyPropertyChanged 成员 public event PropertyChangedEventHandler PropertyChanged; #endregion } /// /// Range 比较器 /// public class RangeFEqualityComparer : IEqualityComparer { /// /// /// /// /// /// public bool Equals(RangeF x, RangeF y) { if ((x.Begin == y.Begin) && (x.End == y.End)) { return true; } else return false; } /// /// /// /// /// public int GetHashCode(RangeF obj) { int hashCode = obj.Begin.GetHashCode(); int hashCode2 = obj.End.GetHashCode(); if (hashCode != hashCode2) { hashCode ^= hashCode2; } return hashCode; } } /// /// RangeF 辅助类 /// public static class EListRangeF { /// /// rlist 必须是由小到大排列 /// /// /// public static void Union(this List rlist, RangeF r) { for (int i = 0; i < rlist.Count(); i++) { RangeF r_dest = rlist[i]; if (r < r_dest)//在 r_dest 前面 { rlist.Insert(i, r); return;//完成 } else if (r.CanUnion(r_dest)) //r 与 r_dest 有交集 { //r 与 r_dest 合体 r = r | r_dest; rlist.RemoveAt(i); i--; //还需要继续判断 } } //r 在 rlist 的后面 rlist.Add(r); } /// /// 联合 /// /// /// public static void Union(this List rlist1, List rlist2) { for (int i = 0; i < rlist2.Count(); i++) { rlist1.Union(rlist2[i]); } } } }