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