如何在C#中判断指定点是否处于两条非线性误差线之间?
实现思路与C#代码
要判断指定点是否处于两条非线性误差线之间,核心逻辑是先通过插值计算出目标X坐标对应两条误差线的Y值,再判断目标点的Y坐标是否落在这两个Y值构成的区间内。
关键步骤
- 数据预处理:确保正负误差线的点集按X坐标升序排列,方便后续插值定位。
- 插值计算:针对目标X值,在误差线的离散点中找到对应区间,用插值法(默认线性插值,可按需替换为更高精度的非线性插值)计算该X值对应的误差线Y值;若X超出误差线的X范围,可根据业务规则选择外推或直接判定为不在区间内。
- 区间判断:比较目标点Y值与两条误差线的插值Y值,若落在区间内则判定为符合条件。
C# 实现代码
坐标点辅助类
public class Point2D { public double X { get; set; } public double Y { get; set; } public Point2D(double x, double y) { X = x; Y = y; } }
核心判断方法
using System; using System.Collections.Generic; using System.Linq; public class ErrorLineChecker { // 线性插值计算目标X对应的Y值,返回插值是否有效 private static bool TryLinearInterpolation(List<Point2D> points, double targetX, out double interpolatedY) { interpolatedY = double.NaN; if (points == null || points.Count < 2) return false; // 按X升序排序点集 var sortedPoints = points.OrderBy(p => p.X).ToList(); // 处理X小于最小点的情况(直接取第一个点的Y) if (targetX <= sortedPoints[0].X) { interpolatedY = sortedPoints[0].Y; return true; } // 处理X大于最大点的情况(直接取最后一个点的Y) if (targetX >= sortedPoints.Last().X) { interpolatedY = sortedPoints.Last().Y; return true; } // 查找目标X所在的区间并做线性插值 for (int i = 0; i < sortedPoints.Count - 1; i++) { var leftPoint = sortedPoints[i]; var rightPoint = sortedPoints[i + 1]; if (targetX >= leftPoint.X && targetX <= rightPoint.X) { double slope = (rightPoint.Y - leftPoint.Y) / (rightPoint.X - leftPoint.X); interpolatedY = leftPoint.Y + slope * (targetX - leftPoint.X); return true; } } return false; } // 判断目标点是否在两条误差线之间 public static bool IsPointBetweenErrorLines(List<Point2D> upperErrorPoints, List<Point2D> lowerErrorPoints, double targetX, double targetY) { // 获取正误差线在目标X处的Y值 if (!TryLinearInterpolation(upperErrorPoints, targetX, out double upperY)) return false; // 获取负误差线在目标X处的Y值 if (!TryLinearInterpolation(lowerErrorPoints, targetX, out double lowerY)) return false; // 确保区间上下限正确(避免误差线点顺序颠倒) double minY = Math.Min(lowerY, upperY); double maxY = Math.Max(lowerY, upperY); // 判断目标Y是否在区间内 return targetY >= minY && targetY <= maxY; } }
使用示例
// 构造正误差线点集 var upperPoints = new List<Point2D> { new Point2D(0, 2), new Point2D(1, 3), new Point2D(2, 5), new Point2D(3, 4) }; // 构造负误差线点集 var lowerPoints = new List<Point2D> { new Point2D(0, 0), new Point2D(1, 0.5), new Point2D(2, 1), new Point2D(3, 0.8) }; // 判断点(1.5, 2)是否在误差线之间 bool result = ErrorLineChecker.IsPointBetweenErrorLines(upperPoints, lowerPoints, 1.5, 2); Console.WriteLine(result); // 输出:True
扩展说明
- 若误差线非线性程度较高,可将线性插值替换为三次样条插值,提升精度;需自行实现样条插值逻辑,或使用轻量数值计算工具类。
- 若业务要求X超出误差线范围时直接判定为不符合条件,修改
TryLinearInterpolation中对应分支的返回值为false即可。
内容的提问来源于stack exchange,提问作者H_H
相关产品推荐
相关产品推荐

