得到了这样的函数,如果曲线太接近直线(它的直线),就从曲线上删除一些点.但关键是坐标的大小.一条曲线可以有1000个左右的坐标,它使程序的运行速度慢了3-4倍.

如果不判断所有直线,则需要开始索引和结束索引(坐标大小约3000)

(List<int>, List<int>) LineCheck(List<int> Xcurve, List<int> Ycurve, List<int> XLine, List<int> YLine, double deviation)
        {
            //point - координаты точки для проверки, LineUp - список координат верхней прямой
            //LineDown - список координат нижней прямой
            List<int> returnCurveX = new List<int>();
            List<int> returnCurveY = new List<int>();
            //отклонение от прямой, для большей точности проверки можно уменьшить
            //но надо проверять по факту

            for (int i = 0; i < Xcurve.Count - 1; i++)
            {
                bool flag = true;
                int XStartIndex = XLine.Where(w => w >= Xcurve[0]).First();
                int XEndIndex = XLine.Where(w => w <= Xcurve[Xcurve.Count - 1]).Last();

                for (int j = XStartIndex; j < XEndIndex; j++)
                {
                    double[] vector1 = { Xcurve[i] - XLine[j], Ycurve[i] - YLine[j] };
                    // Вычисление длин векторов
                    double length1 = Math.Sqrt(vector1[0] * vector1[0] + vector1[1] * vector1[1]);
                    if (length1 < deviation)
                    {
                        flag = false;


                    }

                }
                if (flag)

                {
                    returnCurveX.Add(Xcurve[i]);
                    returnCurveY.Add(Ycurve[i]);
                    //принадлежит прямой
                }
            }

           // return (Xcurve, Ycurve);
            //точка не попала на координаты прямой
            return (returnCurveX, returnCurveY);


        }

我试图以某种方式打破第一个循环,但它不允许我返回所需的分数.如果我们能改变震源数组,也许会更容易些.

推荐答案

假设XLineYLine各得2分,我们可以试着解题,如下所示. 有一条线是通过两个点(ax, ay)(bx, by)画的,我们可以把这条线写成一个等式

A * x + B * y + C = 0

As(https://math.stackexchange.com/questions/422602/convert-two-points-to-line-eq-ax-by-c-0)

A = ay - by
B = bx - ax
C = ax * by - bx * ay

有了这个方程,我们就可以很容易地计算出从点(px, py)到直线的距离.

DistanceSquared = (A * px + B * py + C) * (A * px + B * py + C) / (A * A + B * B)

大概是这样的:

LineCheck(...) {
  ...

  // Let use long to avoid integer overflow
  long ax = XLine[0];
  long bx = XLine[1];
  long ay = YLine[0];
  long by = YLine[1];

  long A = ay - by;
  long B = bx - ax;
  long C = ax * by - bx * ay;

  for (int i = 0; i < Xcurve.Count; ++i) {
    double px = Xcurve[i];
    double py = Ycurve[i];

    var d2 = (A * px + B * py + C) * (A * px + B * py + C) / (A * A + B * B);

    if (d2 >= deviation * deviation) {
      returnCurveX.Add(Xcurve[i]);
      returnCurveY.Add(Ycurve[i]);
    }
  }

  ...
}

Csharp相关问答推荐

如何打印已添加到List的Linq值,而不是C#中的:System.Collections.Generic.List ' 1[System.Int32]?

O(N)测试失败

有没有一种方法可以防止在编译时在MicrosoftC或非单线程上下文中调用方法?

为什么EF Core 6会针对null验证Count(*)?

在. net毛伊岛窗口的深度链接已经创建""

System.Text.Json数据化的C#类映射

. NET JSON属性自定义所需逻辑

只有第一个LINQ.Count()语句有效

Blazor在FluentButton onClick事件上设置参数

StackExchange.Redis.RedisServerException:调用ITransaction.ExecuteAsync()时出现错误未知命令取消监视

如何在C#中实现非抛出`MinBy`?

正确处理嵌套的本机集合

WPF动态设置弹出窗口水平偏移

Blazor Server/.NET 8/在初始加载时调用异步代码是否冻结屏幕,直到第一次异步调用完成?

用于获取字符串的最后12个字符的正则表达式(空格除外)

为什么在使用JsonDerivedType序列化泛型时缺少$type?

WPF:如何从DatagridHeader的内容模板绑定到词典项

为什么我的属性即使没有显式地设置任何[必需]属性,也会显示验证?

将两个JSON文件与覆盖值的主文件合并

为什么使用User.IsInRole()总是返回FALSE?