public static Texture2D pick(int[,] pPatternMark,int pPickPatternID,
        Texture2D pSource, zzPointBounds pBounds, zzPoint pOutSize)
    {
        Texture2D lOut = new Texture2D(pOutSize.x, pOutSize.y, TextureFormat.ARGB32, false);
        var lMin = pBounds.min;
        var lMax = pBounds.max;
        var lDrawOffset = -lMin;
        for (int lY = lMin.y; lY < lMax.y; ++lY)
        {
            var lDrawedPointY = lY + lDrawOffset.y;
            for (int lX = lMin.x; lX < lMax.x; ++lX)
            {
                var lColor = pPatternMark[lX, lY] == pPickPatternID
                    ? pSource.GetPixel(lX, lY) : Color.clear;

                lOut.SetPixel(lX + lDrawOffset.x, lDrawedPointY, lColor);
            }
            for (int i = lMax.x+lDrawOffset.x; i < lOut.width; ++i)
            {
                lOut.SetPixel(i, lDrawedPointY, Color.clear);
            }
        }
        for (int lY = lMax.y + lDrawOffset.y; lY < lOut.height; ++lY)
        {
            for (int lX = 0; lX < lOut.width; ++lX)
                lOut.SetPixel(lX, lY, Color.clear);
        }
        lOut.Apply();
        return lOut;
    }
    public override void sweepPicture()
    {
        pointNumber = 0;
        polygonNumber = 0;
        holeNumber = 0;
        var lPatternResult = zzOutlineSweeper.sweeper(activeChart);
        imagePatterns = new Texture2D[lPatternResult.Count];
        imagePatternBounds = new zzPointBounds[lPatternResult.Count];

        //拾取图块
        for (int i = 0; i < lPatternResult.Count; ++i)
        {
            zzPointBounds lBounds = lPatternResult.sweeperPointResults[i].Bounds;
            imagePatternBounds[i] = lBounds;
            var lBoundMin = lBounds.min;
            var lBoundMax = lBounds.max;
            zzPoint lPatternSize = new zzPoint(
                Mathf.NextPowerOfTwo(lBoundMax.x - lBoundMin.x + 1),
                Mathf.NextPowerOfTwo(lBoundMax.y - lBoundMin.y + 1)
                );
            imagePatterns[i] = zzImagePatternPicker.pick(lPatternResult.patternMark, i + 1,
                picture, lBounds, lPatternSize);
        }
        //var lSweeperResults = zzOutlineSweeper.sweeper(activeChart, ignoreDistanceInSweeping);
        var lSweeperResults = zzOutlineSweeper
            .simplifySweeperResult(lPatternResult.sweeperPointResults, ignoreDistanceInSweeping);
        modelsSize = new Vector2((float)activeChart.width, (float)activeChart.height);

        //存储结果
        concaves = new List<zz2DConcave>();
        var lNewImagePatterns =new List<Texture2D>(lPatternResult.Count);
        var lNewPatternBounds = new List<zzPointBounds>(lPatternResult.Count);
        for (int i = 0; i < lSweeperResults.Count; ++i)
        {
            var lSweeperResult = lSweeperResults[i];
            var lImage = imagePatterns[i];
            if (lSweeperResult.edge.Length < 2 || lImage.width < 3 || lImage.height<3)
                continue;
            lNewImagePatterns.Add(lImage);
            lNewPatternBounds.Add(imagePatternBounds[i]);
            zzSimplyPolygon lPolygon = new zzSimplyPolygon();
            lPolygon.setShape(lSweeperResult.edge);

            zz2DConcave lConcave = new zz2DConcave();
            lConcave.setShape(lPolygon);
            ++polygonNumber;

            foreach (var lHole in lSweeperResult.holes)
            {
                if (lHole.Length < 2)
                    continue;
                zzSimplyPolygon lHolePolygon = new zzSimplyPolygon();
                lHolePolygon.setShape(lHole);
                lConcave.addHole(lHolePolygon);
                ++holeNumber;
            }

            concaves.Add(lConcave);
        }

        imagePatterns = lNewImagePatterns.ToArray();
        imagePatternBounds = lNewPatternBounds.ToArray();
    }
예제 #3
0
 public zzPointBounds(zzPointBounds other)
 {
     mMin = other.mMin;
     mMax = other.mMax;
 }