public BoardInfo ProcessImage(BoardParameters bp, Pixels pix) { BoardInfo boardInfo = null; boardInfo = new BoardInfo(bp.FieldWidth, bp.FieldHeight); int halfSize = (int)(bp.BlockSize / 2) + 1; int[,] circleRadiusData = CalculateRadii((dx, dy) => (int)Math.Sqrt(dx * dx + dy * dy), halfSize); int[,] squareRadiusData = CalculateRadii((dx, dy) => (int)Math.Max(Math.Abs(dx), Math.Abs(dy)), halfSize); for (int y = 0; y < bp.FieldHeight; y++) { for (int x = 0; x < bp.FieldWidth; x++) { int px = (int)Math.Round(bp.LinedBoardRect.Left + bp.BlockSize * x); int py = (int)Math.Round(bp.LinedBoardRect.Top + bp.BlockSize * y); RawColor[] circles = RadiusColor(pix, new Point(px, py), circleRadiusData, 2 * halfSize ); RawColor[] squares = RadiusColor(pix, new Point(px, py), squareRadiusData, 2 * halfSize ); PointInfo info = new PointInfo(); info.StoneColor = GetStoneColor(circles, bp.BlockSize); info.SmallStoneColor = GetSmallStoneColor(circles, bp.BlockSize); if (info.SmallStoneColor == info.StoneColor) //Small stone is part of the real stone { info.SmallStoneColor = StoneColor.None; } if (GetCircleMarker(circles, bp.BlockSize, info.StoneColor)) { if (info.SmallStoneColor != StoneColor.Black) //Can't distinguish circle from small stone { info.Marker = Marker.Circle; } } if (GetSquareMarker(squares, bp.BlockSize, info.StoneColor)) { info.Marker = Marker.Square; } boardInfo.Board[x, y] = info; } } //MirrorBoardInfo(boardInfo); return(boardInfo); }
public BoardInfo ProcessImage(BoardParameters bp, Pixels pix) { BoardInfo boardInfo = null; boardInfo = new BoardInfo(bp.FieldWidth, bp.FieldHeight); int halfSize = (int)(bp.BlockSize / 2) + 1; int[,] circleRadiusData = CalculateRadii((dx, dy) => (int)Math.Sqrt(dx * dx + dy * dy), halfSize); int[,] squareRadiusData = CalculateRadii((dx, dy) => (int)Math.Max(Math.Abs(dx), Math.Abs(dy)), halfSize); for (int y = 0; y < bp.FieldHeight; y++) for (int x = 0; x < bp.FieldWidth; x++) { int px = (int)Math.Round(bp.LinedBoardRect.Left + bp.BlockSize * x); int py = (int)Math.Round(bp.LinedBoardRect.Top + bp.BlockSize * y); RawColor[] circles = RadiusColor(pix, new Point(px, py), circleRadiusData, 2 * halfSize ); RawColor[] squares = RadiusColor(pix, new Point(px, py), squareRadiusData, 2 * halfSize ); PointInfo info = new PointInfo(); info.StoneColor = GetStoneColor(circles, bp.BlockSize); info.SmallStoneColor = GetSmallStoneColor(circles, bp.BlockSize); if (info.SmallStoneColor == info.StoneColor)//Small stone is part of the real stone info.SmallStoneColor = StoneColor.None; if (GetCircleMarker(circles, bp.BlockSize, info.StoneColor)) { if (info.SmallStoneColor != StoneColor.Black)//Can't distinguish circle from small stone info.Marker = Marker.Circle; } if (GetSquareMarker(squares, bp.BlockSize, info.StoneColor)) info.Marker = Marker.Square; boardInfo.Board[x, y] = info; } //MirrorBoardInfo(boardInfo); return boardInfo; }