You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 23:50:09