在用EmguCv进行轮廓查找时,经常碰到四边形点集排序错乱的问题,查了些方法,感觉有些复杂。想到了一个比较笨的方法来实现:先计算中心点坐标,再把每个顶点跟中心点进行比对
代码如下
/// <summary>
/// 将给定点集顺时针排序
/// </summary>
/// <param name="pts_src">四边形四个顶点组成的点集</param>
/// <returns></returns>
public PointF[] SortPointsByClockwise(PointF[] pts_src)
{
if (pts_src.Length != 4) return null;//确保为四边形
//求四边形中心点?坐标
float x_average = 0;
float y_average = 0;
float x_sum = 0;
float y_sum = 0;
for (int i = 0; i < 4; i++)
{
x_sum += pts_src[i].X;
y_sum += pts_src[i].Y;
}
x_average = x_sum / 4;
y_average = y_sum / 4;
PointF center = new PointF(x_average, y_average);
PointF[] result = new PointF[4];
for (int i = 0; i < 4; i++)
{
if (pts_src[i].X < center.X && pts_src[i].Y < center.Y)
{
result[0] = pts_src[i];//左上角点
}
if (pts_src[i].X > center.X && pts_src[i].Y < center.Y)
{
result[1] = pts_src[i];//右上角点
}
if (pts_src[i].X > center.X && pts_src[i].Y > center.Y)
{
result[2] = pts_src[i];//右下角点
}
if (pts_src[i].X < center.X && pts_src[i].Y > center.Y)
{
result[3] = pts_src[i];//左下角点
}
}
return result;
}