public static bool isIsolatedPoint(zzPoint pPoint,zzActiveChart tex)
    {
        var lDetectDirection = new DetectDirection();

        var lNextPoint = lDetectDirection.getOfsetPoint(pPoint);

        //下一个像素是否可用
        var isNextActivePiexl = tex.isInside(lNextPoint) && tex.isActive(lNextPoint);

        var lNextNextPoint = new zzPoint();
        bool isNextNextActivePiexl;

        for (int i = 0; i < 8;++i )
        {
            lDetectDirection.toNextDirection();
            //下下个像素是否可用
            lNextNextPoint = lDetectDirection.getOfsetPoint(pPoint);

            isNextNextActivePiexl = tex.isInside(lNextNextPoint)&&tex.isActive(lNextNextPoint);

            //连续两个像素可用,则此像素非孤立
            if(isNextActivePiexl && isNextNextActivePiexl)
                return false;
            isNextActivePiexl = isNextNextActivePiexl;

        }
        return true;
    }
 public static void removeIsolatedPoint(zzActiveChart tex)
 {
     for (int y = 0; y < tex.height; ++y)
     {
         for (int x = 0; x < tex.width; ++x)
         {
             if (tex.isActive(x,y)&&isIsolatedPoint(new zzPoint(x, y), tex))
             {
                 tex.setActive(x, y, false);
             }
         }
     }
 }
    public static SweeperPointPatternResult sweeper(zzActiveChart tex)
    {
        List<SweeperPointResult> lPointResults = new List<SweeperPointResult>();
        int[,] lProgressdMark = new int[tex.width, tex.height];
        int[,] lPatternMark = new int[tex.width, tex.height];
        var lOut = new SweeperPointPatternResult();
        lOut.sweeperPointResults = lPointResults;
        lOut.patternMark = lPatternMark;
        //removeIsolatedPoint(tex);
        int lPolygonMark = 1;
        for (int y = 0; y < tex.height; ++y)
        {
            bool lPreIsActive = false;
            int lMark = 0;
            for (int x = 0; x < tex.width; ++x)
            {
                //bool lNowIsActive = isActivePiexl(tex.GetPixel(x, y));
                bool lNowIsActive = tex.isActive(x, y);
                if (!lPreIsActive && lNowIsActive )
                {
                    //为外边
                    if(lProgressdMark[x, y] == 0)
                    {
                        SweeperPointResult lSweeperResult = new SweeperPointResult();
                        lSweeperResult.edge
                            =beginEdge(tex, x, y, lProgressdMark, lPolygonMark++);
                        lPointResults.Add(lSweeperResult);
                    }
                    lMark = lProgressdMark[x, y];

                }
                else if (lPreIsActive && !lNowIsActive && lProgressdMark[x - 1, y] == 0)
                {
                    //为孔
                    lPointResults[lMark - 1].holes.Add(
                        beginEdge(tex, x - 1, y, lProgressdMark, lMark)
                         );
                    lMark = 0;
                }
                else if (lPreIsActive && !lNowIsActive)
                    lMark = 0;

                lPatternMark[x, y] = lMark;

                lPreIsActive = lNowIsActive;
            }
        }
        return lOut;
    }
    public override void pickPicture()
    {
        activeChart = new zzActiveChart(picture.width, picture.height);
        if (sweepMode == SweepMode.ignoreColor)
        {
            for (int x = 0; x < picture.width; ++x)
            {
                for (int y = 0; y < picture.height; ++y)
                {
                    activeChart.setActive(x, y, picture.GetPixel(x, y) != colorInSweepSetting);
                }
            }

        }
        else if (sweepMode == SweepMode.designatedColor)
        {
            for (int x = 0; x < picture.width; ++x)
            {
                for (int y = 0; y < picture.height; ++y)
                {
                    activeChart.setActive(x, y, picture.GetPixel(x, y) == colorInSweepSetting);
                }
            }

        }
        else //if (sweepMode == SweepMode.ignoreAlphaZero)
        {
            for (int x = 0; x < picture.width; ++x)
            {
                for (int y = 0; y < picture.height; ++y)
                {
                    activeChart.setActive(x, y, picture.GetPixel(x, y).a != 0);
                }
            }

        }
        zzOutlineSweeper.removeIsolatedPoint(activeChart);
    }
    //static bool isInsideImg(zzPoint pPoint,Texture2D tex)
    //{
    //    return pPoint.x >= 0
    //            && pPoint.x < tex.width
    //            && pPoint.y >= 0
    //            && pPoint.y < tex.height;
    //}
    static zzPoint[] beginEdge(zzActiveChart tex, zzPoint beginPosition, int[,] pProgressdMark, int pMark)
    {
        List<zzPoint> lOut = new List<zzPoint>();
        lOut.Add(beginPosition);
        pProgressdMark[beginPosition.x, beginPosition.y] = pMark;
        DetectDirection lDetectDirection = new DetectDirection();
        //int nowX=beginX,nowY=beginY;
        zzPoint lNowPoint = beginPosition;
        //int lNextX,lNextY;
        zzPoint lNextPoint;
        int lTotalNum = tex.width*tex.height;
        while(true)
        {

            lNextPoint = lDetectDirection.getOfsetPoint(lNowPoint);
            var lNextDirection = lDetectDirection.nextDirection();
            var lNextNextPoint = lNextDirection.getOfsetPoint(lNowPoint);

            if (tex.isInside(lNextPoint) && tex.isActive(lNextPoint))
            {

                lNowPoint = lNextPoint;

                if (lNowPoint == beginPosition)
                    break;
                pProgressdMark[lNowPoint.x, lNowPoint.y] = pMark;
                lOut.Add(lNowPoint);
                lDetectDirection.toPreDirection();
                lDetectDirection.toPreDirection();
            }
            else
            {
                //不可用,继续顺时针寻找
                lDetectDirection.toNextDirection();
            }

            if(lOut.Count>lTotalNum)
            {
                Debug.LogError("error ");
                break;
            }
        }

        return lOut.ToArray();
    }
 static zzPoint[] beginEdge(zzActiveChart tex, int beginX, int beginY, int[,] pProgressdMark, int pMark)
 {
     return beginEdge(tex, new zzPoint(beginX, beginY), pProgressdMark, pMark);
 }
 public static List<SweeperResult> sweeper(zzActiveChart tex, float ignoreDistance)
 {
     return simplifySweeperResult(sweeper(tex).sweeperPointResults, ignoreDistance);
 }