namespace Yw.Curve { /// /// 不拟合 /// public class TwinRelateCurve0 : IFitPoint { /// /// /// public TwinRelateCurve0(CurveExpress express) { _express = express; } /// /// /// public TwinRelateCurve0(List points) { if (points == null || points.Count < 4) { throw new Exception("出现数值计算问题, 无法解出不拟合线!"); } _express = BuildCurveExpress(points); } //曲线表达式 private CurveExpress _express = null; /// /// 获取拟合点Y /// public double GetFitPointY(double x) { if (_express == null) { return default; } //尽量用贝塞尔曲线 if (_express.DefinePoints != null && _express.DefinePoints.Count > 4) { var b = BezierCurveHelper.CreateOpenCurves(_express.DefinePoints); var s = BezierCurveHelper.GetSectPointsByX(b, x); if (s != null && s.Count > 0) { return s.Last().Y; } } if (_express.DefinePoints != null && _express.DefinePoints.Count > 1) { var sect = _express.DefinePoints.GetInterPointY(x); if (sect == null || sect.Count < 1) { return default; } return sect.First(); } return default; } /// /// 获取拟合点列表 /// public List GetFitPoints(int pointNumber) { if (_express == null) { return default; } return _express.DefinePoints; } /// /// 通过X区间获取拟合点列表 /// public List GetFitPointsByXRange(double minX, double maxX, int pointNumber) { if (_express == null) { return default; } return _express.DefinePoints; } /// /// 创建曲线表达式 /// public static CurveExpress BuildCurveExpress(List points) { if (points == null || points.Count < 4) { return default; } points = points.OrderBy(x => x.X).ToList(); var express = new CurveExpress { FitType = eFitType.ThroughPoint, DefinePoints = points.Select(x => new CurvePoint(x)).ToList() }; express.Min = points.Min(x => x.X); express.Max = points.Max(x => x.X); return express; } } }