示例#1
0
        public override void GenerateMapping(int w, int h, Shape original, Shape warped, Dictionary<Point, Point> mapping)
        {
            double[,] X = new double[4, 4];
            double[] Y = new double[4];

            X[0, 0] = 1; X[1, 0] = warped.GetTopLeftPixel().GetX(); X[2, 0] = warped.GetTopLeftPixel().GetY(); X[3, 0] = X[1, 0] * X[2, 0];
            X[0, 1] = 1; X[1, 1] = warped.GetTopRightPixel().GetX(); X[2, 1] = warped.GetTopRightPixel().GetY(); X[3, 1] = X[1, 1] * X[2, 1];
            X[0, 2] = 1; X[1, 2] = warped.GetBottomRightPixel().GetX(); X[2, 2] = warped.GetBottomRightPixel().GetY(); X[3, 2] = X[1, 2] * X[2, 2];
            X[0, 3] = 1; X[1, 3] = warped.GetBottomLeftPixel().GetX(); X[2, 3] = warped.GetBottomLeftPixel().GetY(); X[3, 3] = X[1, 3] * X[2, 3];

            Y[0] = original.GetTopLeftPixel().GetX();
            Y[1] = original.GetTopRightPixel().GetX();
            Y[2] = original.GetBottomRightPixel().GetX();
            Y[3] = original.GetBottomLeftPixel().GetX();

            Solver.Solve(X, Y);
            double a0 = Y[0], a1 = Y[1], a2 = Y[2], a3 = Y[3];

            Y[0] = original.GetTopLeftPixel().GetY();
            Y[1] = original.GetTopRightPixel().GetY();
            Y[2] = original.GetBottomRightPixel().GetY();
            Y[3] = original.GetBottomLeftPixel().GetY();

            Solver.Solve(X, Y);
            double b0 = Y[0], b1 = Y[1], b2 = Y[2], b3 = Y[3];

            List<Pixel> warpedPixels = warped.GetPixels();
            foreach (Pixel pixel in warpedPixels)
            {
                int originalX = Math.Min(w - 1, Math.Max(0, Convert.ToInt32(a0 + a1 * pixel.GetX() + a2 * pixel.GetY() + a3 * pixel.GetX() * pixel.GetY())));
                int originalY = Math.Min(h - 1, Math.Max(0, Convert.ToInt32(b0 + b1 * pixel.GetX() + b2 * pixel.GetY() + b3 * pixel.GetX() * pixel.GetY())));

                mapping.Add(new Point(pixel.GetX(), pixel.GetY()), new Point(originalX, originalY));
            }
        }
示例#2
0
        public override void GenerateMapping(int w, int h, Shape original, Shape warped, Dictionary<Point, Point> mapping)
        {
            double xOff = original.GetTopLeftPixel().GetX();
            double yOff = original.GetTopLeftPixel().GetY();
            double offsetX = original.GetTopRightPixel().GetX() - original.GetTopLeftPixel().GetX();
            double offsetY = original.GetBottomRightPixel().GetY() - original.GetTopRightPixel().GetY();

            double oTopLeftX = 0;
            double oTopLeftY = 0;
            double oTopRightX = (original.GetTopRightPixel().GetX() - xOff) / offsetX;
            double oTopRightY = (original.GetTopRightPixel().GetY() - yOff) / offsetY;
            double oBottomRightX = (original.GetBottomRightPixel().GetX() - xOff) / offsetX;
            double oBottomRightY = (original.GetBottomRightPixel().GetY() - yOff) / offsetY;
            double oBottomLeftX = (original.GetBottomLeftPixel().GetX() - xOff) / offsetX;
            double oBottomLeftY = (original.GetBottomLeftPixel().GetY() - yOff) / offsetY;
            double wTopLeftX = (warped.GetTopLeftPixel().GetX() - xOff) / offsetX;
            double wTopLeftY = (warped.GetTopLeftPixel().GetY() - yOff) / offsetY;
            double wTopRightX = (warped.GetTopRightPixel().GetX() - xOff) / offsetX;
            double wTopRightY = (warped.GetTopRightPixel().GetY() - yOff) / offsetY;
            double wBottomRightX = (warped.GetBottomRightPixel().GetX() - xOff) / offsetX;
            double wBottomRightY = (warped.GetBottomRightPixel().GetY() - yOff) / offsetY;
            double wBottomLeftX = (warped.GetBottomLeftPixel().GetX() - xOff) / offsetX;
            double wBottomLeftY = (warped.GetBottomLeftPixel().GetY() - yOff) / offsetY;

            double[,] X = new double[4, 4];
            double[] Y = new double[4];

            X[0, 0] = 1; X[1, 0] = oTopLeftX; X[2, 0] = oTopLeftY; X[3, 0] = X[1, 0] * X[2, 0];
            X[0, 1] = 1; X[1, 1] = oTopRightX; X[2, 1] = oTopRightY; X[3, 1] = X[1, 1] * X[2, 1];
            X[0, 2] = 1; X[1, 2] = oBottomRightX; X[2, 2] = oBottomRightY; X[3, 2] = X[1, 2] * X[2, 2];
            X[0, 3] = 1; X[1, 3] = oBottomLeftX; X[2, 3] = oBottomLeftY; X[3, 3] = X[1, 3] * X[2, 3];

            Y[0] = wTopLeftX;
            Y[1] = wTopRightX;
            Y[2] = wBottomRightX;
            Y[3] = wBottomLeftX;

            Solver.Solve(X, Y);
            double a0 = Y[0], a1 = Y[1], a2 = Y[2], a3 = Y[3];

            Y[0] = wTopLeftY;
            Y[1] = wTopRightY;
            Y[2] = wBottomRightY;
            Y[3] = wBottomLeftY;

            Solver.Solve(X, Y);
            double b0 = Y[0], b1 = Y[1], b2 = Y[2], b3 = Y[3];

            double A = (b2 * a3) - (b3 * a2);
            double B_One = (b0 * a3 - b3 * a0) + (b2 * a1 - b1 * a2);
            double C_One = b0 * a1 - b1 * a0;

            List<Pixel> warpedPixels = warped.GetPixels();
            foreach (Pixel pixel in warpedPixels)
            {
                double pX = (pixel.GetX() - xOff) / offsetX;
                double pY = (pixel.GetY() - yOff) / offsetY;

                double B = B_One + (b3 * pX - a3 * pY);
                double C = C_One + (b1 * pX - a1 * pY);

                double q = -0.5 * (B + Math.Sqrt(Math.Pow(B, 2) - 4 * A * C));
                double originalY_ = C / q;
                double originalX_ = (pX - a0 - a2 * originalY_) / (a1 + a3 * originalY_);

                int originalX = Math.Min(w - 1, Math.Max(0, Convert.ToInt32(Math.Max(0, Math.Min(w, originalX_ * offsetX + xOff)))));
                int originalY = Math.Min(h - 1, Math.Max(0, Convert.ToInt32(Math.Max(0, Math.Min(h, originalY_ * offsetY + yOff)))));

                mapping.Add(new Point(pixel.GetX(), pixel.GetY()), new Point(originalX, originalY));
            }
        }