private bool IsCharacterMatchAtPoint(int x, int y, NeighborDifference[,] searchDifferences, CharacterData characterData, float tolerance) { if (x + characterData.Difference.GetLength(1) >= searchDifferences.GetLength(1) || y + characterData.Difference.GetLength(0) >= searchDifferences.GetLength(0)) return false; if (x == 31 && y == 140) { } for (int charY = 0; charY < characterData.Difference.GetLength(0); charY++) { for (int charX = 0; charX < characterData.Difference.GetLength(1); charX++) { if (x + charX == 279 && y + charY == 192) { } NeighborDifference characterDifference = characterData.Difference[charY, charX]; NeighborDifference searchDifference = searchDifferences[y + charY, x + charX]; if ((characterDifference.HasUp && Math.Abs(characterDifference.Up - searchDifference.Up) > tolerance) || (characterDifference.HasDown && Math.Abs(characterDifference.Down - searchDifference.Down) > tolerance) || (characterDifference.HasLeft && Math.Abs(characterDifference.Left - searchDifference.Left) > tolerance) || (characterDifference.HasRight && Math.Abs(characterDifference.Right - searchDifference.Right) > tolerance)) { return false; } if (characterDifference.IsPartOfChar &&((!characterDifference.HasUp && Math.Abs(searchDifference.Up) < 0.05) || (!characterDifference.HasDown && Math.Abs(searchDifference.Down) < 0.05) || (!characterDifference.HasLeft && Math.Abs(searchDifference.Left) < 0.05) || (!characterDifference.HasRight && Math.Abs(searchDifference.Right) < 0.05))) { return false; } } } return true; }
public IEnumerable<FoundTextData> FindCharacterData(CharacterData characterData, float tolerance = 0.05f) { for (int y = 0; y < neighborDifferences.GetLength(0); y++) { for (int x = 0; x < neighborDifferences.GetLength(1); x++) { if (IsCharacterMatchAtPoint(x, y, neighborDifferences, characterData, tolerance)) { yield return new FoundTextData { Bounds = new Rectangle(x, y, characterData.Width, characterData.Height), Text = characterData.Letter.ToString() }; } } } }