From bd2c0ed221e235420c7fdffefa1cdfa085529a0a Mon Sep 17 00:00:00 2001 From: lixiaojun <1287241240@qq.com> Date: 星期五, 24 十一月 2023 12:43:15 +0800 Subject: [PATCH] 升级 --- Yw.CurveBase.Core/7-fit/FitHelper.cs | 98 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 98 insertions(+), 0 deletions(-) diff --git a/Yw.CurveBase.Core/7-fit/FitHelper.cs b/Yw.CurveBase.Core/7-fit/FitHelper.cs index 6d314b5..c313e20 100644 --- a/Yw.CurveBase.Core/7-fit/FitHelper.cs +++ b/Yw.CurveBase.Core/7-fit/FitHelper.cs @@ -160,5 +160,103 @@ } } + + #region 鑾峰緱X鍊� + + /// <summary> + /// 鑾峰彇绾挎�ф彃鍊糥锛堝彲鑳芥湁澶氫釜鐐癸級 + /// </summary> + public static List<CurvePoint> GetInterPointX(List<CurvePoint> pts, double y) + { + if (pts == null || pts.Count < 2) + { + return default; + } + var list = new List<CurvePoint>(); + for (int i = 0; i < pts.Count - 1; i++) + { + if ((y >= pts[i].Y && y <= pts[i + 1].Y) || (y <= pts[i].Y && y >= pts[i + 1].Y)) + {//鐩寸嚎鎻掑�� + double x; + if (Math.Abs(pts[i].Y - pts[i + 1].Y) < 0.01) + x = (pts[i].X + pts[i + 1].X) * 0.5; + else + x = pts[i].X + (pts[i + 1].X - pts[i].X) * (y - pts[i].Y) / (pts[i + 1].Y - pts[i].Y); + + list.Add(new CurvePoint(x, y)); + } + } + return list; + } + + /// <summary> + /// 鑾峰彇绾挎�ф彃鍊糥锛堝彲鑳芥湁澶氫釜鐐癸級(鍏佽寤堕暱) + /// </summary> + public static List<CurvePoint> GetInterPointXByExtend(List<CurvePoint> pts, double y) + { + if (pts == null || pts.Count < 2) + { + return default; + } + + //鍦ㄨ寖鍥村唴 + var minY = pts.Min(x => x.Y); + var maxY = pts.Max(x => x.Y); + if (y >= minY && y <= maxY) + { + return GetInterPointX(pts, y); + } + + var list = new List<CurvePoint>(); + + //鍒ゆ柇鏄惁鍦ㄥ墠闈㈢殑寤堕暱閮ㄥ垎 + double x_start = CurveLineHelper.GetXbyY(pts[0].X, pts[0].Y, pts[1].X, pts[1].Y, y); + if (x_start <= pts[0].X) + { + if (x_start > 0 && x_start > pts[0].X * 0.9)//鏀句竴鐐逛綑閲� + { + list.Add(new CurvePoint(x_start, y)); + } + } + + //鍒ゆ柇鏄惁鍦ㄥ悗闈㈢殑寤堕暱閮ㄥ垎:U鍨嬫洸绾� 鏄墠鍚庨兘鏈� + double x_end = CurveLineHelper.GetXbyY(pts[pts.Count - 2].X, pts[pts.Count - 2].Y, pts[pts.Count - 1].X, pts[pts.Count - 1].Y, y); + if (x_end >= pts[pts.Count - 1].X && x_end < pts[pts.Count - 1].X * 1.1)//鏀句竴鐐逛綑閲� + { + list.Add(new CurvePoint(x_end, y)); + } + + return list; + } + + /// <summary> + /// 鑾峰彇绾挎�ф彃鍊糥锛堝彲鑳芥湁澶氫釜鐐癸級 + /// </summary> + public static List<CurvePoint> GetInterPointX(CurveExpress express, double y, int pointNumber = 20, double extendRatio = 1.0) + { + if (express == null) + { + return default; + } + var pts = express.GetFitPointsByXRange(express.Min, express.Max * extendRatio, pointNumber); + return GetInterPointX(pts, y); + } + + /// <summary> + /// 鑾峰彇绾挎�ф彃鍊糥锛堝彲鑳芥湁澶氫釜鐐癸級(鍏佽寤堕暱) + /// </summary> + public static List<CurvePoint> GetInterPointXByExtend(CurveExpress express, double y, int pointNumber = 20, double extendRatio = 1.2) + { + if (express == null) + { + return default; + } + var pts = express.GetFitPointsByXRange(express.Min, express.Max * extendRatio, pointNumber); + return GetInterPointXByExtend(pts, y); + } + + + #endregion 鑾峰緱X鍊� + } } -- Gitblit v1.9.3