C/C++实现:矩形框四个顶点顺时针排序

1 篇文章 0 订阅
本文分享了如何在C/C++中为控制题中的STM32主控通过k210或openmv摄像头获取的矩形框四顶点坐标进行顺时针排序,以确保数据发送的正确性。作者提供了详细的冒泡排序算法实现。
摘要由CSDN通过智能技术生成

C/C++实现:矩形框四个顶点顺时针排序

在备战2023年国电时,所在小组选择的是控制题,是使用k210或者openmv摄像头获取矩形框四顶点坐标再通过串口发送给主控stm32,当时担心发送的点不是按顺时针的,所以就想弄个程序将得到的四个点坐标先进行顺时针排序,但在网上都没有找到用C实现该要求的代码,故自己尝试编写实现,现开源分享给大家。

大致原理就是:
先将将四个顶点的x坐标进行比较,x坐标小的那两个为左上角和左下角两点假设称为点A和点B,坐标大的两个为右上角和右下角的两点假设称为点C和点D,再比较AB两点的y坐标,y坐标小的则为左上角点;同理比较CD两点y坐标,y坐标小的则为右上角点,我设置的坐标系如下图所示:
在这里插入图片描述

具体代码实现如下,

short x0 = 0, y0 = 0;  //左上角点
short x1 = 0, y1 = 0;  //左下角点
short x2 = 0, y2 = 0;  //右下角点
short x3 = 0, y3 = 0;  //左下角点

//=====================================================================
//  @brief      矩形四个角点顺时针排序
//  @param      乱序的矩形四个角点的坐标
//  @return     无
//  @illustrate 改变全局变量x0,y0,x1,y1,x2,y2,x3,y3作为修正后矩形四角点坐标   
//======================================================================
void change_rect_clockwise(short xx0, short yy0,short xx1, short yy1, short xx2, short yy2, short xx3, short yy3)
{

    unsigned char i, j;
    short temp;
    short x_input[4];
    short y_input[4];
    short x_change[4];
    short y_change[4];
    short x_output[4];
    short y_output[4];

    //角点顺序修正为顺时针
    x_input[0] = xx0;  //输入x
    x_input[1] = xx1;
    x_input[2] = xx2;
    x_input[3] = xx3;
    
    y_input[0] = yy0; //输入y
    y_input[1] = yy1;
    y_input[2] = yy2;
    y_input[3] = yy3;
    
    x_change[0] = x_input[0];
    x_change[1] = x_input[1];
    x_change[2] = x_input[2];
    x_change[3] = x_input[3];

    // for(i=0;i<4;i++)
    // {
    //     printf("%d ", x_input[i]);
    // }
    

    for(i=1;i<=4-1;i++)       //冒泡排序   /*i代表排序轮数,总轮数=元素个数-1*/
	{
		for(j=0;j<4-i;j++)       /*j代表每轮排序次数,次数=个数-轮数-1,但j初值为0*/
		{
			if(x_change[j]>=x_change[j+1])   /*如果前一项比后一项大,则两项的值互换*/
			{
				temp=x_change[j];
				x_change[j]=x_change[j+1];
				x_change[j+1]=temp;
			}
		}
	}

    if(x_change[0] == x_change[1])   //矩形水平
    {
        y_change[0] = y_input[0];
        y_change[1] = y_input[1];
        y_change[2] = y_input[2];
        y_change[3] = y_input[3];

        for(i=1;i<=4-1;i++)       //冒泡排序   /*i代表排序轮数,总轮数=元素个数-1*/
	    {
            for(j=0;j<4-i;j++)       /*j代表每轮排序次数,次数=个数-轮数-1,但j初值为0*/
            {
                if(y_change[j]>=y_change[j+1])   /*如果前一项比后一项大,则两项的值互换*/
                {
                    temp=y_change[j];
                    y_change[j]=y_change[j+1];
                    y_change[j+1]=temp;
                }
            }
	    }

        x0 = x_change[0];
        y0 = y_change[0];

        x1 = x_change[2];
        y1 = y_change[1];

        x2 = x_change[1];
        y2 = y_change[2];

        x3 = x_change[3];
        y3 = y_change[3];


    }
    else    //矩形一般姿态
    {
        // for(i=0;i<4;i++)
        // {
        //     printf("%d ", x_change[i]);
        // }

        for(i=0; i<4; i++)
        {
            if(x_change[0] == x_input[i])break;
        }

        y_change[0] = y_input[i];

        for(i=0; i<4; i++)
        {
            if(x_change[1] == x_input[i])break;
        }

        y_change[1] = y_input[i];

        for(i=0; i<4; i++)
        {
            if(x_change[2] == x_input[i])break;
        }

        y_change[2] = y_input[i];

        for(i=0; i<4; i++)
        {
            if(x_change[3] == x_input[i])break;
        }

        y_change[3] = y_input[i];

        if(y_change[0] < y_change[1])
        {
            x0 = x_change[0];
            y0 = y_change[0];

            x3 = x_change[1];
            y3 = y_change[1];

        }
        else if(y_change[0] > y_change[1])
        {
            x3 = x_change[0];
            y3 = y_change[0];

            x0 = x_change[1];
            y0 = y_change[1];
        }

        if(y_change[2] <= y_change[3])
        {
            x1 = x_change[2];
            y1 = y_change[2];

            x2 = x_change[3];
            y2 = y_change[3];

        }
        else if(y_change[2] > y_change[3])
        {
            x2 = x_change[2];
            y2 = y_change[2];

            x1 = x_change[3];
            y1 = y_change[3];
        }
    }

}

以上代码可能存在欠缺的部分,仅供参考,如果有任何意见和建议,欢迎与我交流!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值