C#矩阵XY排序

news2025/1/13 15:56:41

矩阵XY快速排序

using MyVision.Script.Method;

public class MyScript : ScriptMethods
{
    //
    struct MOTIONPOSXY_S
    {
        public double Pos_x;
        public double Pos_y;
    };

    //脚本执行该方法
    public bool Process()
    {//@
        try
        {
            //脚本代码写在下方 
            List<double> PointX = GetDoubleList("斑点分析.X");
            List<double> PointY = GetDoubleList("斑点分析.Y");
            List<MOTIONPOSXY_S> PointList = new List<MOTIONPOSXY_S>();
            for (int i = 0; i < PointX.Count(); ++i)
            {
                MOTIONPOSXY_S tmp;
                tmp.Pos_x = PointX[i];
                tmp.Pos_y = PointY[i];
                PointList.Add(tmp);
            }

            //
            QuickSort(ref PointList, 0, PointX.Count() - 1);
            for (int i = 0; i < PointX.Count(); ++i)
            {
                PointX[i] = PointList[i].Pos_x;
                PointY[i] = PointList[i].Pos_y;
                //LogWarn("" + i + ":" + PointList[i].Pos_x + " " + PointList[i].Pos_y+ "", "");
            }

            //
            List<double> MPointX = new List<double>();
            List<double> MPointY = new List<double>();
            for (int i = 0; i < PointX.Count(); ++i)
            {
                MPointX.Add(PointList[i].Pos_x);
                MPointY.Add(PointList[i].Pos_y);
            }

            //
            SetDoubleList("数组定义.PointX", MPointX);
            SetDoubleList("数组定义.PointY", MPointY);

            //
            return true;
        }
        catch (Exception ex)
        {
            LogError(GetLogPre() + ex.ToString());
            return false;
        }
    }

    int Partition(ref List<MOTIONPOSXY_S> list, int low, int high)
    {
        MOTIONPOSXY_S pbase = list[low];
        while (low < high)
        {
            while (low < high && CompareMotion_PosXy(pbase, list[high]))
            {
                --high;
            }
            if (low < high)
            {
                list[low] = list[high];
            }
            while (low < high && CompareMotion_PosXy(list[low], pbase))
            {
                ++low;
            }
            if (low < high)
            {
                list[high] = list[low];
            }
        }
        list[low] = pbase;
        return low;
    }

    void QuickSort(ref List<MOTIONPOSXY_S> list, int low, int high)
    {
        if (low < high)
        {
            int pbase = Partition(ref list, low, high);
            QuickSort(ref list, low, pbase - 1);
            QuickSort(ref list, pbase + 1, high);
        }
    }

    //两个坐标比较大小const Test &v1, const Test &v2
    bool CompareMotion_PosXy(MOTIONPOSXY_S p1, MOTIONPOSXY_S p2)
    {
        double difference = p1.Pos_y - p2.Pos_y;
        difference = (difference >= 0 ? difference : (-difference));
        if (p1.Pos_y < p2.Pos_y)
        {
            if (difference < 100) return (p1.Pos_x < p2.Pos_x);
            else return true;
        }
        else if (p1.Pos_y == p2.Pos_y)
        {
            return (p1.Pos_x < p2.Pos_x);
        }
        else
        {
            if (difference < 100) return (p1.Pos_x < p2.Pos_x);
            else return false;
        }
    }
}

九点标定从中间往外排序

using MyVision.Script.Method;

public class MyScript : ScriptMethods
{
    //
    struct MOTIONPOSXY_S
    {
        public double Pos_x;
        public double Pos_y;
        public double Pos_r;
    };

    //脚本执行该方法
    public bool Process()
    {//@
        try
        {
            //脚本代码写在下方 
            List<double> PointX = GetDoubleList("斑点分析.X");
            List<double> PointY = GetDoubleList("斑点分析.Y");
            List<double> PointR = GetDoubleList("斑点分析.最大内直径");
            List<MOTIONPOSXY_S> PointList = new List<MOTIONPOSXY_S>();
            for (int i = 0; i < PointX.Count(); ++i)
            {
                MOTIONPOSXY_S tmp;
                tmp.Pos_x = PointX[i];
                tmp.Pos_y = PointY[i];
                tmp.Pos_r = PointR[i]/2;
                PointList.Add(tmp);
            }

            //
            QuickSort(ref PointList, 0, PointX.Count() - 1);
            for (int i = 0; i < PointX.Count(); ++i)
            {
                PointX[i] = PointList[i].Pos_x;
                PointY[i] = PointList[i].Pos_y;
                PointR[i] = PointList[i].Pos_r;
                LogWarn("" + i + ":" + PointList[i].Pos_x + " " + PointList[i].Pos_y + PointList[i].Pos_r + "", "");
            }

            //
            List<double> MPointX = new List<double>();
            List<double> MPointY = new List<double>();
            List<double> MPointR = new List<double>();

            //
            MPointX.Add(PointX[4]); MPointX.Add(PointX[5]);
            MPointX.Add(PointX[2]); MPointX.Add(PointX[1]); MPointX.Add(PointX[0]);
            MPointX.Add(PointX[3]);
            MPointX.Add(PointX[6]); MPointX.Add(PointX[7]); MPointX.Add(PointX[8]);

            //
            MPointY.Add(PointY[4]); MPointY.Add(PointY[5]);
            MPointY.Add(PointY[2]); MPointY.Add(PointY[1]); MPointY.Add(PointY[0]);
            MPointY.Add(PointY[3]);
            MPointY.Add(PointY[6]); MPointY.Add(PointY[7]); MPointY.Add(PointY[8]);

            //
            MPointR.Add(PointR[4]); MPointR.Add(PointR[5]);
            MPointR.Add(PointR[2]); MPointR.Add(PointR[1]); MPointR.Add(PointR[0]);
            MPointR.Add(PointR[3]);
            MPointR.Add(PointR[6]); MPointR.Add(PointR[7]); MPointR.Add(PointR[8]);

            //
            SetDoubleList("数组定义.Value0", MPointX);
            SetDoubleList("数组定义.Value1", MPointY);
            SetDoubleList("数组定义.Value2", MPointR);
            
            //
            return true;
        }
        catch (Exception ex)
        {
            LogError(GetLogPre() + ex.ToString());
            return false;
        }
    }

    int Partition(ref List<MOTIONPOSXY_S> list, int low, int high)
    {
        MOTIONPOSXY_S pbase = list[low];
        while (low < high)
        {
            while (low < high && CompareMotion_PosXy(pbase, list[high]))
            {
                --high;
            }
            if (low < high)
            {
                list[low] = list[high];
            }
            while (low < high && CompareMotion_PosXy(list[low], pbase))
            {
                ++low;
            }
            if (low < high)
            {
                list[high] = list[low];
            }
        }
        list[low] = pbase;
        return low;
    }

    void QuickSort(ref List<MOTIONPOSXY_S> list, int low, int high)
    {
        if (low < high)
        {
            int pbase = Partition(ref list, low, high);
            QuickSort(ref list, low, pbase - 1);
            QuickSort(ref list, pbase + 1, high);
        }
    }

    //两个坐标比较大小const Test &v1, const Test &v2
    bool CompareMotion_PosXy(MOTIONPOSXY_S p1, MOTIONPOSXY_S p2)
    {
        double difference = p1.Pos_y - p2.Pos_y;
        difference = (difference >= 0 ? difference : (-difference));
        if (p1.Pos_y < p2.Pos_y)
        {
            if (difference < 100) return (p1.Pos_x < p2.Pos_x);
            else return true;
        }
        else if (p1.Pos_y == p2.Pos_y)
        {
            return (p1.Pos_x < p2.Pos_x);
        }
        else
        {
            if (difference < 100) return (p1.Pos_x < p2.Pos_x);
            else return false;
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/927157.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

会员管理系统实战开发教程03-会员管理功能

我们上篇介绍了会员管理的列表页&#xff0c;及新增功能开发。本篇我们继续我们的会员管理功能&#xff0c;介绍一下详情、修改、删除功能。 1 创建详情页 打开控制台&#xff0c;点击创建页面的图标&#xff0c;创建详情页 2 数据详情组件 详情页我们也是使用数据容器组…

RTSP/Onvif视频服务器EasyNVR视频平台微信端出现播放失败的问题解决方案

EasyNVR是基于RTSP/Onvif协议接入的视频平台&#xff0c;具备视频直播监控、录像、检索与回看、存储、国标级联等视频能力&#xff0c;可支持将接入的视频流进行全平台、全终端的分发&#xff0c;包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等。 有用户反馈&#xff0c;在…

shopee平台好做吗,有什么优势?

shopee平台提供了一个庞大而活跃的用户群体。作为东南亚地区最受欢迎的购物平台之一&#xff0c;shopee平台吸引了数百万用户每天在该平台上进行交易。这意味着商家可以通过shopee平台获得更大范围和更广泛的曝光机会。无论是刚创业还是已经有一定规模和知名度的企业&#xff0…

最简单的Obsidian图床配置

参考文章&#xff1a; Obsidian 将图片批量上传至图床 Obsidian中图床自动上传设置 前言 配置图床的目的&#xff1a;解决 Obsidian 图片存储问题&#xff0c;一般来说 Obsidian 图片是以本地链接的方式存储在文章当中&#xff0c;当图片移动的时候文章中的图片就会出错。 …

翻倍以链表形式表示的数字

题目&#xff1a; 示例&#xff1a; 思路&#xff1a; 有点相似于&#xff1a;链表相加II&#xff0c;这道题我们仍然有进位&#xff0c;但不同的是&#xff0c;链表相加我们选择了开辟新节点&#xff0c;这道题我们选择反转两次链表&#xff0c;开始一次&#xff0c;结束一次…

能够解决问题的客服电话系统方案

客服电话的应用场景通常是以呼入的电话为主&#xff0c;属于服务性质的更重视服务质量&#xff0c;客服电话方案主要解决呼叫中心运营中的一些问题&#xff0c;下面就来详细了解下。 企业的客服电话通常都是统一的一个热线号码&#xff0c;如&#xff1a;400电话、800电话、95号…

若依Cloud集成Flowable6.7.2

项目简介 基于若依Cloud的Jove-Fast微服务项目&#xff0c;集成工作流flowable(接上篇文章) 若依Cloud集成积木报表 项目地址&#xff1a;https://gitee.com/wxjstudy/jove-fast 后端 新建模块 目录结构如下: 引入依赖 前提:引入依赖之前先配置好maven的setting.xml &…

基于SpringBoot和Vue的前后端分离项目(高校毕业生信息管理平台)

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 基于SpringBoot和Vue的前后端分离项目&#xff08;高校…

OceanMind海睿思签约常州市建筑科学研究院,打造检验检测行业数字化转型标杆

近日&#xff0c;中新赛克海睿思 与 中国知名综合性建筑研究和科技创新型高科技企业——常州市建筑科学研究院集团股份有限公司&#xff08;以下简称“建科股份”&#xff09;达成深度战略合作&#xff0c;为建科股份提供行业领先的数据工程建设服务&#xff0c;携手推进检验检…

视频云存储/安防监控视频AI智能分析网关V3:抽烟/打电话功能详解

人工智能技术已经越来越多地融入到视频监控领域中&#xff0c;近期我们也发布了基于AI智能视频云存储/安防监控视频AI智能分析平台的众多新功能&#xff0c;该平台内置多种AI算法&#xff0c;可对实时视频中的人脸、人体、物体等进行检测、跟踪与抓拍&#xff0c;支持口罩佩戴检…

助力工业物联网,工业大数据之服务域:可视化工具Grafana介绍【三十八】

文章目录 前言08&#xff1a;可视化工具Grafana介绍09&#xff1a;可视化工具Grafana部署10&#xff1a;Grafana集成Prometheus11&#xff1a;Grafana集成MySQL监控 前言 项目所需工具: 链接&#xff1a;https://pan.baidu.com/s/1sIa8nninf2Fz6YqE3vUpqQ?pwd5wr3 提取码&…

mysql数据库管理及增删改查

目录 1、数据库管理 1.1、数据库表的文件 1.1.1、MYD”文件&#xff1a; 1.1.2、“.MYI”文件 1.2、日志&#xff1a; 1.3、mysql 数据库管理 1.3.1、数据库管理命令 1.3.2、数据库列的类型 2、SQL语句 2.1、DDL&#xff1a;数据定义语言&#xff0c;用于创建数据库对…

盖革核辐射检测仪pcba方案设计

核辐射检测仪又可以称为辐射检测仪&#xff0c;根据它的类型可以分为便携式与固定式&#xff0c;两种类型的仪器所应用的领域是不同的。目前市场上存在的辐射报警仪&#xff0c;是一种不带剂量显示功能的仪器&#xff0c;仅有辐射超标报警功能&#xff0c;不能具体显示出它的数…

【PHP】PHP基本语法

1、PHP标记 当解析一个文件时&#xff0c;PHP 会寻找起始和结束标记&#xff0c;也就是 <?php 和 ?>&#xff0c;告诉 PHP 开始和停止解析二者之间的代码。此种解析方式使得 PHP 可以被嵌入到各种不同的文档中去&#xff0c;而任何起始和结束标记之外的部分都会被 PHP…

【VUE】数字动态变化到目标值-vue-count-to

vue-count-to是一个Vue组件&#xff0c;用于实现数字动画效果。它可以用于显示从一个数字到另一个数字的过渡动画。 插件名&#xff1a;vue-count-to 官方仓库地址&#xff1a;GitHub - PanJiaChen/vue-countTo: Its a vue component that will count to a target number at a…

10.Oracle中decode函数

【函数格式】&#xff1a; decode ( expression, condition_01, result_01, condition_02, result_02, ......, condition_n, result_n, result_default) 【函数说明】&#xff1a; 若表达式expression值与condition_01值匹配&#xff0c;则返回result_01&#xff0c;…

XGBoost,NVIDIA是什么

目录 XGBoost 算法层面 什么是 XGBoost GBDT是什么 GBDT中的GB 为何选择 XGBoost&#xff1f; XGBoost 的优势和属性 XGBoost 和数据科学家 为何 XGBoost 在 GPU 上表现更出色 XGBoost RAPIDS GPU 加速的 XGBoost NVIDIA是什么 使用 Spark XGBoost 的 GPU 加速端…

【图像分割】实现snake模型的活动轮廓模型以进行图像分割研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

交换机的4种网络结构

级联方式 这是最常用的一种组网方式&#xff0c;它通过交换机上的级联口&#xff08;UpLink&#xff09;进行连接。级联可以定义为两台或两台以上的交换机通过一定的方式相互连接。根据需要&#xff0c;多台交换机可以以多种方式进行级联。 在较大的局域网例如园区网 ( 校园…

如何解决全彩LED显示屏像素失控问题

全彩LED显示屏像素失控问题可能由多种原因引起&#xff0c;包括电力问题、驱动器问题、数据连接问题、模块故障等。 要解决这些问题&#xff0c;可以采取以下步骤&#xff1a; 检查电源供应&#xff1a; 确保LED显示屏的电源供应稳定&#xff0c;没有电压波动或电源故障。 检查…