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]);
}
}
}
}