public static Byte[,] ThinPicture(this Byte[,] newPicture) { Byte[,] picture = new Byte[newPicture.GetLength(0) + 2, newPicture.GetLength(1) + 2]; Byte[,] pictureToRemove = new Byte[newPicture.GetLength(0) + 2, newPicture.GetLength(1) + 2]; bool hasChanged; for (int i = 0; i < picture.GetLength(1); i++) { for (int j = 0; j < picture.GetLength(0); j++) { picture[j, i] = 255; pictureToRemove[j, i] = 0; } } for (int i = 0; i < newPicture.GetLength(1); i++) { for (int j = 0; j < newPicture.GetLength(0); j++) { picture[j + 1, i + 1] = newPicture[j, i]; } } for (int i = 0; i < picture.GetLength(1); i++) { for (int j = 0; j < picture.GetLength(0); j++) { picture[j, i] = picture[j, i] == 0 ? picture[j, i] = 1 : picture[j, i] = 0; } } do { hasChanged = false; for (int i = 0; i < newPicture.GetLength(1); i++) { for (int j = 0; j < newPicture.GetLength(0); j++) { //if ((picture[j, i] == 1) && (2 <= B(picture, j, i)) && (B(picture, j, i) <= 6) && (A(picture, j, i) == 1) && // (picture[j, i - 1] * picture[j + 1, i] * picture[j, i + 1] == 0) && // (picture[j + 1, i] * picture[j, i + 1] * picture[j - 1, i] == 0)) if ((picture[j, i] == 1) && (2 <= picture.B(j, i)) && (picture.B(j, i) <= 6) && (picture.A(j, i) == 1) && (picture[j, i - 1] * picture[j + 1, i] * picture[j, i + 1] == 0) && (picture[j + 1, i] * picture[j, i + 1] * picture[j - 1, i] == 0)) { pictureToRemove[j, i] = 1; hasChanged = true; } } } for (int i = 0; i < newPicture.GetLength(1); i++) { for (int j = 0; j < newPicture.GetLength(0); j++) { if (pictureToRemove[j, i] == 1) { picture[j, i] = 0; pictureToRemove[j, i] = 0; } } } for (int i = 0; i < newPicture.GetLength(1); i++) { for (int j = 0; j < newPicture.GetLength(0); j++) { //if ((picture[j, i] == 1) && (2 <= B(picture, j, i)) && (B(picture, j, i) <= 6) && // (A(picture, j, i) == 1) && // (picture[j, i - 1] * picture[j + 1, i] * picture[j - 1, i] == 0) && // (picture[j, i - 1] * picture[j, i + 1] * picture[j - 1, i] == 0)) if ((picture[j, i] == 1) && (2 <= picture.B(j, i)) && (picture.B(j, i) <= 6) && (picture.A(j, i) == 1) && (picture[j, i - 1] * picture[j + 1, i] * picture[j - 1, i] == 0) && (picture[j, i - 1] * picture[j, i + 1] * picture[j - 1, i] == 0)) { pictureToRemove[j, i] = 1; hasChanged = true; } } } for (int i = 0; i < newPicture.GetLength(1); i++) { for (int j = 0; j < newPicture.GetLength(0); j++) { if (pictureToRemove[j, i] == 1) { picture[j, i] = 0; pictureToRemove[j, i] = 0; } } } } while (hasChanged); for (int i = 0; i < newPicture.GetLength(1); i++) { for (int j = 0; j < newPicture.GetLength(0); j++) { if ((picture[j, i] == 1) && (((picture[j, i - 1] * picture[j + 1, i] == 1) && (picture[j - 1, i + 1] != 1)) || ((picture[j + 1, i] * picture[j, i + 1] == 1) && (picture[j - 1, i - 1] != 1)) || //Небольшая модификцаия алгоритма для ещё большего утоньшения ((picture[j, i + 1] * picture[j - 1, i] == 1) && (picture[j + 1, i - 1] != 1)) || ((picture[j, i - 1] * picture[j - 1, i] == 1) && (picture[j + 1, i + 1] != 1)))) { picture[j, i] = 0; } } } for (int i = 0; i < picture.GetLength(1); i++) { for (int j = 0; j < picture.GetLength(0); j++) { // picture[j, i] = picture[j, i] == 0 ? 255 : 0; if (0 == picture[j, i]) { picture[j, i] = 255; } else { picture[j, i] = 0; } } } Byte[,] outPicture = new Byte[newPicture.GetLength(0), newPicture.GetLength(1)]; for (int i = 0; i < newPicture.GetLength(1); i++) { for (int j = 0; j < newPicture.GetLength(0); j++) { outPicture[j, i] = picture[j + 1, i + 1]; } } return(outPicture); }