用广度优先遍历位图中的相同颜色区域,勾画处该色块,代码如下: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;
}
}
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;
}
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货