public static int GetQuadraticDifference(ColorTupleRGB a, ColorTupleRGB b) { return((a.R - b.R) * (a.R - b.R) + (a.G - b.G) * (a.G - b.G) + (a.B - b.B) * (a.B - b.B)); }
public static List <Tuple <PieceData, long> > GuestimateMatchingPiece(PieceData given, List <PieceData> possible, DIRECTION dir) { // no elements were passed if ((given == null) || (possible.Count == 0)) { Console.WriteLine("Problem while finding pieces!"); return(new List <Tuple <PieceData, long> >()); } // exactly one element left if (possible.Count == 1) { return(new List <Tuple <PieceData, long> >(new Tuple <PieceData, long>[] { new Tuple <PieceData, long>(possible[0], 0) })); } // more than one element left List <Tuple <PieceData, long> > differences = new List <Tuple <PieceData, long> >(); foreach (PieceData piece in possible) { long diff = 0; switch (dir) { case DIRECTION.NORTH: for (int x = 2; x < DATA_WIDTH - 2; x++) { for (int givenY = 0; givenY <= 4; givenY++) { if (given.GetImagePixel(x, givenY).Sum != 765) { for (int pieceY = 0; pieceY <= 4; pieceY++) { if (piece.GetImagePixel(x, DATA_HEIGHT - pieceY - 1).Sum != 765) { diff += ColorTupleRGB.GetQuadraticDifference(given.GetImagePixel(x, givenY), piece.GetImagePixel(x, DATA_HEIGHT - pieceY - 1)); break; } } break; } } } break; case DIRECTION.SOUTH: for (int x = 2; x < DATA_WIDTH - 2; x++) { for (int givenY = 0; givenY <= 4; givenY++) { if (given.GetImagePixel(x, DATA_HEIGHT - givenY - 1).Sum != 765) { for (int pieceY = 0; pieceY <= 4; pieceY++) { if (piece.GetImagePixel(x, pieceY).Sum != 765) { diff += ColorTupleRGB.GetQuadraticDifference(given.GetImagePixel(x, DATA_HEIGHT - givenY - 1), piece.GetImagePixel(x, pieceY)); break; } } break; } } } break; case DIRECTION.EAST: for (int y = 2; y < DATA_HEIGHT - 2; y++) { for (int givenX = 0; givenX <= 4; givenX++) { if (given.GetImagePixel(DATA_WIDTH - givenX - 1, y).Sum != 765) { for (int pieceX = 0; pieceX <= 4; pieceX++) { if (piece.GetImagePixel(pieceX, y).Sum != 765) { diff += ColorTupleRGB.GetQuadraticDifference(given.GetImagePixel(DATA_HEIGHT - givenX - 1, y), piece.GetImagePixel(pieceX, y)); break; } } break; } } } break; case DIRECTION.WEST: for (int y = 2; y < DATA_HEIGHT - 2; y++) { for (int givenX = 0; givenX <= 4; givenX++) { if (given.GetImagePixel(givenX, y).Sum != 765) { for (int pieceX = 0; pieceX <= 4; pieceX++) { if (piece.GetImagePixel(DATA_WIDTH - pieceX - 1, y).Sum != 765) { diff += ColorTupleRGB.GetQuadraticDifference(given.GetImagePixel(givenX, y), piece.GetImagePixel(DATA_HEIGHT - pieceX - 1, y)); break; } } break; } } } break; } differences.Add(new Tuple <PieceData, long>(piece, diff)); } Console.WriteLine("Guestimate from " + possible.Count + " items: " + string.Join(" , ", differences.Select(x => x.Item2 + ":" + x.Item1.Filename))); return(differences); }