C# 实现剔除相邻的点坐标集合

using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        // 假设原始点坐标集合为 points
        List<Point> points = new List<Point>();

        // 剔除相邻的点
        List<Point> filteredPoints = FilterAdjacentPoints(points);

        // 输出结果
        Console.WriteLine("原始点坐标集合:");
        foreach (var point in points)
        {
            Console.WriteLine($"({point.X}, {point.Y})");
        }

        Console.WriteLine("剔除相邻点后的点坐标集合:");
        foreach (var point in filteredPoints)
        {
            Console.WriteLine($"({point.X}, {point.Y})");
        }
    }

    // 剔除相邻的点
    static List<Point> FilterAdjacentPoints(List<Point> points)
    {
        List<Point> filteredPoints = new List<Point>();

        // 如果点集合为空或只有一个点,则直接返回
        if (points.Count <= 1)
        {
            filteredPoints = points;
        }
        else
        {
            // 将第一个点添加到筛选后的点集合中
            filteredPoints.Add(points[0]);

            // 遍历剩余点的集合,只添加不与前一个点相邻的点
            for (int i = 1; i < points.Count; i++)
            {
                if (points[i].DistanceTo(filteredPoints[filteredPoints.Count - 1]) > 0)
                {
                    filteredPoints.Add(points[i]);
                }
            }
        }

        return filteredPoints;
    }
}

// 点类
class Point
{
    public int X { get; set; }
    public int Y { get; set; }

    // 计算点与另一个点之间的距离
    public double DistanceTo(Point otherPoint)
    {
        return Math.Sqrt(Math.Pow(otherPoint.X - this.X, 2) + Math.Pow(otherPoint.Y - this.Y, 2));
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#中使用OpenCvSharp库进行直线拟合可以采用最小二乘法。具体步骤如下: 1. 定义一个Mat类型的数组存储坐标集合。 2. 调用cv::fitLine函数进行最小二乘法直线拟合,该函数需要传入以下参数: - 输入集合Mat类型数组; - 输出斜率k,截距b,起x0,y0; - 方法:CV_DIST_L2表示欧几里德距离。 3. 根据得到的斜率、截距、起始绘制直线。 下面是示例代码: ```csharp using OpenCvSharp; // 定义集合 Mat points = new Mat(4, 1, MatType.CV_32FC2); points.Set<float>(0, 0, 10); points.Set<float>(0, 1, 10); points.Set<float>(1, 0, 20); points.Set<float>(1, 1, 20); points.Set<float>(2, 0, 30); points.Set<float>(2, 1, 30); points.Set<float>(3, 0, 40); points.Set<float>(3, 1, 40); // 进行最小二乘法直线拟合 Mat lineParams = new Mat(); Cv2.FitLine(points, lineParams, DistanceTypes.L2, 0, 0.01, 0.01); // 获取斜率和截距 float k = lineParams.Get<float>(1, 0) / lineParams.Get<float>(0, 0); float b = lineParams.Get<float>(3, 0) - k * lineParams.Get<float>(2, 0); // 获取起和终坐标 float x0 = lineParams.Get<float>(2, 0) - 1000 * lineParams.Get<float>(0, 0); float y0 = k * x0 + b; float x1 = lineParams.Get<float>(2, 0) + 1000 * lineParams.Get<float>(0, 0); float y1 = k * x1 + b; // 绘制直线 Mat image = new Mat(100, 100, MatType.CV_8UC3, Scalar.All(255)); Cv2.Line(image, new Point((int)x0, (int)y0), new Point((int)x1, (int)y1), Scalar.All(0), 2); ``` 其中,points是存储集合的Mat数组,lineParams是存储拟合结果的Mat数组,k和b是斜率和截距,x0、y0、x1、y1是起和终坐标。最后使用Cv2.Line函数绘制直线即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值