namespace Yw.Curve { /// /// 曲线点 /// public partial class CurvePoint : JsonList, ICloneable { /// /// /// public CurvePoint() { } /// /// /// public CurvePoint(int x, int y) { this.X = x; this.Y = y; } /// /// /// public CurvePoint(float x, float y) { this.X = x; this.Y = y; } /// /// /// public CurvePoint(double x, double y) { this.X = x; this.Y = y; } /// /// /// public CurvePoint(decimal x, decimal y) { this.X = (double)x; this.Y = (double)y; } /// /// /// public CurvePoint(CurvePoint rhs) { this.X = rhs.X; this.Y = rhs.Y; } /// /// X /// public double X { get; set; } /// /// Y /// public double Y { get; set; } /// /// 获取两点之间的距离 /// public double Distance(CurvePoint pt) { if (pt == null) { return double.MaxValue; } return Math.Sqrt(Math.Pow(this.X - pt.X, 2) + Math.Pow(this.Y - pt.Y, 2)); } /// /// 获取点到线的距离 /// public double Distance(List ptList) { if (ptList == null || ptList.Count < 1) { return double.MaxValue; } return ptList.Min(x => x.Distance(this)); } /// /// 判断是否是零点 /// public bool IsZeroPoint() { if (this.X < 0.01 && this.Y < 0.01) { return true; } return false; } /// /// 判断是否为有效点 /// public bool IsValidPoint() { if (double.IsNormal(this.X) && double.IsNormal(this.Y)) { return true; } return false; } /// /// 判断是否为无效点 /// public bool IsInvalidPoint() { if (double.IsNaN(this.X) || double.IsInfinity(this.X) || this.X == double.MinValue || this.X == double.MaxValue) { return true; } if (double.IsNaN(this.Y) || double.IsInfinity(this.Y) || this.Y == double.MinValue || this.Y == double.MaxValue) { return true; } return false; } /// /// 是否沿x轴的射线穿透线段,有交点且在线的左边 /// public bool IsIntersectLineLeft(CurvePoint pt1, CurvePoint pt2) { if (pt1 == null || pt2 == null) { return false; } if (Math.Abs(pt1.Y - pt2.Y) < 0.0001) { if (Math.Abs(this.Y - pt1.Y) < 0.0001) { return true; } } var ymin = UtilsHelper.Min(pt1.Y, pt2.Y); var ymax = UtilsHelper.Max(pt1.Y, pt2.Y); if (this.Y < ymax && this.Y >= ymin) { if (this.X <= (pt1.X + (pt2.X - pt1.X) * (this.Y - pt1.Y) / (pt2.Y - pt1.Y))) { return true; } } return false; } /// /// /// public CurvePoint Clone() { return new CurvePoint(this); } /// /// /// object ICloneable.Clone() { return this.Clone(); } } }