读书人

[急]怎么对不同的坐标值进行分组

发布时间: 2012-01-23 21:57:28 作者: rapoo

[急]如何对不同的坐标值进行分组
现在有一些坐标值, 比如下面:
(10,20),(200,120),(80,60),(75,21),(148,122),(15,59),(302,61),(150,19)

需要对他们进行分组, 把纵坐标相近的归在一起, 以便后面画线, 结果如下:
第一组: (10,20),(75,21),(150,19)
第二组: (200,120),(148,122)
第三组: (80,60),(15,59),(302,61)

求助各位高人, 有什么好的分组算法, 我一向及时结帖, 请各位以诚帮忙!!

[解决办法]
不太好说,实现起来应该不难
typedef struct
{
POINT p;
bool flag;
}POINT_FLAG;

POINT_FLAG pt[10] = {{{10,20},0},...};

int s = 2; //相近度2
int y = p[0].y;
for(int j = 0; j < 10; j++)
for(int i = 0; i < 10; i++)
{
if(pt[i].flag == 0 && pt[i].p.y <= y + s && p[i].p.y > = y - s)
{
SavePoint(j, pt[i].p); //保存第j组点信息
pt[i].flag = 1;
}
}
自己再改改 随便写的



[解决办法]

#include <vector>
/**
* 一对坐标进行分组处理
* @param [in ] value:要分组的坐标值
* @param [out] vvDest:目标二维坐标数组
*/
void InsertNumber( std::pair <int,int> &value,std::vector < std::vector < std::pair <int,int> > > &vvDest )
{
/**
* 定义y坐标相近程度
*/
int nDy = 3;

/**
* 循环分好类的每一个数组
*/
size_t nSize1 = vvDest.size();
for( size_t i = 0; i <nSize1;i++)
{
/**
* 循环组中的每一个数据
*/
size_t nSize2 = vvDest[i].size();
for(size_t j = 0;j <nSize2;j++)
{
/**
* 如果满足y坐标相近条件,则插入到这组中,并跳出循环
*/
if( abs(value.second - vvDest[i][j].second) <nDy )
{
vvDest[i].insert( vvDest[i].begin()+j ,value );
break;
}
}

/**
* 如果已经找到了它所属的组,则跳出外循环
*/
if( j!= nSize2 )
{
break;
}
}

/**
* 如果没有找到它所属于的组,则自己新加一个组
*/
if( i ==nSize1 )
{

std::vector < std::pair <int,int> > v;
v.push_back( value);
vvDest.push_back( v);
}
}

/**
* 分组主函数
*/
void Sort()
{
/**
* 要归类的坐标数组
*/
std::vector < std::pair <int,int> > vSrc;
vSrc.push_back ( std::make_pair( 10,20));
vSrc.push_back ( std::make_pair(200,120));
vSrc.push_back ( std::make_pair(80,60));
vSrc.push_back ( std::make_pair(75,21));
vSrc.push_back ( std::make_pair(148,122));
vSrc.push_back ( std::make_pair(15,59));
vSrc.push_back ( std::make_pair(302,61));
vSrc.push_back ( std::make_pair(150,19) );

/**
* 分组后的二维数组vvDest
*/
std::vector < std::vector < std::pair <int,int> > > vvDest;

/**
* 循环要归类的坐标数组,把每一个数据加入到目标二维数组中
*/
size_t nSize = vSrc.size();
for(size_t i = 0;i <nSize;i++)
{
InsertNumber( vSrc[i], vvDest);
}

/**
* 输出,测试结果是否正确
*/
size_t nSize1 = vvDest.size();
int nDy =3;
for( size_t i = 0; i <nSize1;i++)
{
TRACE( "第%d组 ",i+1);
size_t nSize2 = vvDest[i].size();
for(size_t j = 0;j <nSize2;j++)
{
TRACE( "%d,%d ",vvDest[i][j].first,vvDest[i][j].second );
}
TRACE( "\n ");
}
}

以上代码VC测试通过,直接调用Sort函数可以看到效果.

读书人网 >VC/MFC

热点推荐