namespace IStation.Curve { /// /// /// public class CurvePointComparer { /// /// 排序类型 /// public enum eSortType { X, Y } /// /// 相等类型 /// public enum eEqualType { X, Y, ALL } /// /// 排序比较 /// public class Sort : IComparer { public Sort(eSortType sortType) { _sortType = sortType; } private const double _ignore = 0.0001; private eSortType _sortType; int IComparer.Compare(CurvePoint obj1, CurvePoint obj2) { if (_sortType == eSortType.X) { if (Math.Abs(obj1.X - obj2.X) < _ignore) { return 0; } else if (obj1.X > obj2.X) { return 1; } else { return -1; } } else { if (Math.Abs(obj1.Y - obj2.Y) < _ignore) { return 0; } else if (obj1.Y > obj2.Y) { return 1; } else { return -1; } } } } /// /// 相等比较 /// public class Equal : IEqualityComparer { public Equal() { } public Equal(double ignore, eEqualType equalType) { this._ignore = ignore; this._equalType = equalType; } private double _ignore = 0.001; private eEqualType _equalType = eEqualType.X; public bool Equals(CurvePoint lhs, CurvePoint rhs) { switch (_equalType) { case eEqualType.X: if (Math.Abs(lhs.X - rhs.X) < _ignore) return true; break; case eEqualType.Y: if (Math.Abs(lhs.Y - rhs.Y) < _ignore) return true; break; case eEqualType.ALL: if (Math.Abs(lhs.X - rhs.X) < _ignore && Math.Abs(lhs.Y - rhs.Y) < _ignore) return true; break; } return false; } public int GetHashCode(CurvePoint obj) { return 0; } } } }