我现在在写一个程序,在一张黑底的图上有一块白色的区域,现在我是要从起点开始沿着这个白色的区域的外沿走一圈,并记录每走一步的方向,每一个点都要走到,而且必须按实际的顺序走。我现在走了一圈下来有一些点走不到,请教各位高手有没有合适的算法可以解决这个问题,谢谢了,一定给分,要多少您说话,只要好用

解决方案 »

  1.   


    方法1 扫描正张图,是白点(设为a)选周围8点比较或者4点
    if(memDC.GetPixel(a.x,a.y)==col)   col=白点值
    {
    if(memDC.GetPixel(a.x+1,a.y)==memDC.GetPixel(a.x,a.y)&&
    memDC.GetPixel(a.x+1,a.y+1)==memDC.GetPixel(a.x,a.y)&&
    memDC.GetPixel(a.x,a.y+1)==memDC.GetPixel(a.x,a.y)&&
    memDC.GetPixel(a.x-1,a.y)==memDC.GetPixel(a.x,a.y)&&
    memDC.GetPixel(a.x-1,a.y+1)==memDC.GetPixel(a.x,a.y)&&
    .......................)
    {
    AfxMessageBox("范围内");
    }
    else
    {
    AfxMessageBox("边界上");
    }
    }
    AfxMessageBox("界外");
    方法2 扫描正张图,每一行的第一个和最后一个白点就是边界
    或者每一列的第一个和最后一个白点就是边界
    方法1  方法2各有优缺点,你的那个就用方法2比较好
    (申明,我不搞计算机图形,这只是我的想法)
      

  2.   

    假设按逆时针走
    你要走的图象的为位图T1
    新建同样大小的一个位图T2记录你走过的边缘点。
    建立两个堆栈A1,A2
    A1,A2都用于记录走的方向,但是A2用于回朔A1只是记录方向
    假设起点为白色点吧,黑色同理可推:
    1。起点设置为当前点
    2。当前点的上下左右点的色彩构成4元矢量,(左颜色,下颜色,右颜色,上颜色),可以构成编码xxxx。1表示白色未走过边缘点,0表示黑色,*表示白色已走过边缘点
    3。判断编码有3*3*3*3=81种情况,要对每种情况进行处理,但只分为下面几类(只举特例不一一列举,你可以考虑)
       例1:一般情况如01*0,方向向下压入两个堆。记录当前点到图T2.设当前点 为当前点下面的点。
       例2:回朔:编码中没有1的情况如。将要退回原来点,A2出栈A1入栈。记录当前点到T2,根据A2出栈出来的方向把当前点退回到来路,从新判断,这个时候肯定原来来路的点上检查出的编码会发生变化,因为多出来了一个*号。所以判断也同原来的不同,不会再去走刚才回朔回来的点,有可能会继续回朔的情况。
       例三:编码中有多个1也就是有多个方向可以走需要选择,通常,你只要按照一个顺序选比如来路是上的话也就是XXX*的情况按(左,下,右,上)的顺序确定走方向的优先级。如果来路是左按(下,右,上,左)确定优先级,如果来路是下按(右,上,左,下)确定优先级,如果来路是右按(上,左,下,右确定优先级)。(我晓得如果不按来的方向轮换优先级的话肯定会走到里面去)。
    4。在下一个当前点重复2,3部直到回到起点)。
    5。一切就OK了!Game over!