Ejemplo n.º 1
0
 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));
 }
Ejemplo n.º 2
0
        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);
        }