用广度优先遍历位图中的相同颜色区域,勾画处该色块,代码如下:src是开始点,pPolygon是生成的多边形,m_lpDibBits中是位图数据,m_PointQueue是广度优先遍历中队列的作用,m_flag是标志数组,0表示未遍历,1是在队列中待遍历,2是已遍历
void CCoordView::PolygonFromPoint(CPoint &src, CPolygon *pPolygon)
{
BYTE curColor = m_lpDibBits[src.y * m_nScanWidth + src.x];
         int  neighbor;  //当前点四周同色点的个数

m_PointQueue.RemoveAll();
CPoint cur;
m_PointQueue.AddTail(src);
while(!m_PointQueue.IsEmpty())
{
cur = m_PointQueue.RemoveHead();
neighbor = 0;
if(cur.y > 0          
    &&m_lpDibBits[(cur.y-1)*m_nScanWidth+cur.x] == curColor              &&cur.y%m_nVSpan != 0)
                  {
neighbor++;
if(m_flag[(cur.y-1)*m_nWidth+cur.x] == 0)                   {
m_PointQueue.AddTail(CPoint(cur.x, cur.y-1));
m_flag[(cur.y-1)*m_nWidth+cur.x] = 1;
}
}
if(cur.y < m_nHeight-1
    &&m_lpDibBits[(cur.y+1)*m_nScanWidth+cur.x] == curColor
    &&(cur.y+1)%m_nVSpan != 0)
{
         neighbor++;
if(m_flag[(cur.y+1)*m_nWidth+cur.x] == 0)
{
m_PointQueue.AddTail(CPoint(cur.x, cur.y+1));
m_flag[(cur.y+1)*m_nWidth+cur.x] = 1;
}
}
if(cur.x > 0
    &&m_lpDibBits[cur.y*m_nScanWidth+cur.x-1] == curColor
    &&cur.x%m_nHSpan != 0)
{
neighbor++;
if(m_flag[cur.y*m_nWidth+cur.x-1] == 0)
{
m_PointQueue.AddTail(CPoint(cur.x-1, cur.y));push++;
m_flag[cur.y*m_nWidth+cur.x-1] = 1;
}
}
if(cur.x < m_nWidth-1
&&m_lpDibBits[cur.y*m_nScanWidth+cur.x+1] == curColor
&&(cur.x+1)%m_nHSpan != 0)
{
neighbor++;
if(m_flag[cur.y*m_nWidth+cur.x+1] == 0)
{
m_PointQueue.AddTail(CPoint(cur.x+1, cur.y));push++;
m_flag[cur.y*m_nWidth+cur.x+1] = 1;
}
}
if(neighbor == 4) 
pPolygon->AddInsidePoint(cur);
else
pPolygon->AddBorderPoint(cur);
m_flag[cur.y*m_nWidth+cur.x] = 2;
}
}

解决方案 »

  1.   

    中间的2句push++忘记删了,无意义。这个函数在点的个数较多时,比如几万,执行时间以分钟计,是难以容忍的。希望大家帮我看看是哪里比较耗时间需要改进一下?开始怀疑是链表的效率,经测试向一个CList添加100000个节点后删除,时间不到1秒。
      

  2.   

    to 888atao(阿涛) :就是用来从位图生成稿样to holyeagle(一杯清茶) :是不是大数组数据的访问?这个用什么方法解决比较好呢?