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];
}
}
}
以上代码可能存在欠缺的部分,仅供参考,如果有任何意见和建议,欢迎与我交流!