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); }