Guest User

Matrix transformation

a guest
Jan 29th, 2016
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.74 KB | None | 0 0
  1. import java.awt.Point;
  2. import java.awt.geom.Point2D;
  3. import java.awt.image.BufferedImage;
  4.  
  5. public class BufferedImageTransform extends BufferedImageUtils{
  6.     public static BufferedImage computeImage(BufferedImage image, Point p0, Point p1, Point p2, Point p3) {
  7.         int w = image.getWidth();
  8.         int h = image.getHeight();
  9.  
  10.         BufferedImage result = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
  11.  
  12.         Point2D ip0 = new Point2D.Double(0, 0);
  13.         Point2D ip1 = new Point2D.Double(0, h);
  14.         Point2D ip2 = new Point2D.Double(w, h);
  15.         Point2D ip3 = new Point2D.Double(w, 0);
  16.  
  17.         Matrix3D m = computeProjectionMatrix(new Point2D[] { p0, p1, p2, p3 }, new Point2D[] { ip0, ip1, ip2, ip3 });
  18.         Matrix3D mInv = new Matrix3D(m);
  19.         mInv.invert();
  20.  
  21.         for (int y = 0; y < h; y++) {
  22.             for (int x = 0; x < w; x++) {
  23.                 Point2D p = new Point2D.Double(x, y);
  24.                 mInv.transform(p);
  25.                 int ix = (int) p.getX();
  26.                 int iy = (int) p.getY();
  27.                 if (ix >= 0 && ix < w && iy >= 0 && iy < h) {
  28.                     int rgb = image.getRGB(ix, iy);
  29.                     result.setRGB(x, y, rgb);
  30.                 }
  31.             }
  32.         }
  33.         return result;
  34.     }
  35.  
  36.     private static Matrix3D computeProjectionMatrix(Point2D p0[], Point2D p1[]) {
  37.         Matrix3D m0 = computeProjectionMatrix(p0);
  38.         Matrix3D m1 = computeProjectionMatrix(p1);
  39.         m1.invert();
  40.         m0.mul(m1);
  41.         return m0;
  42.     }
  43.  
  44.     private static Matrix3D computeProjectionMatrix(Point2D p[]) {
  45.         Matrix3D m = new Matrix3D(p[0].getX(), p[1].getX(), p[2].getX(), p[0].getY(), p[1].getY(), p[2].getY(), 1, 1,
  46.                 1);
  47.         Point3D p3 = new Point3D(p[3].getX(), p[3].getY(), 1);
  48.         Matrix3D mInv = new Matrix3D(m);
  49.         mInv.invert();
  50.         mInv.transform(p3);
  51.         m.m00 *= p3.x;
  52.         m.m01 *= p3.y;
  53.         m.m02 *= p3.z;
  54.         m.m10 *= p3.x;
  55.         m.m11 *= p3.y;
  56.         m.m12 *= p3.z;
  57.         m.m20 *= p3.x;
  58.         m.m21 *= p3.y;
  59.         m.m22 *= p3.z;
  60.         return m;
  61.     }
  62.  
  63.     public static class Point3D {
  64.         double x;
  65.         double y;
  66.         double z;
  67.  
  68.         Point3D(double x, double y, double z) {
  69.             this.x = x;
  70.             this.y = y;
  71.             this.z = z;
  72.         }
  73.     }
  74.  
  75.     public static class Matrix3D {
  76.         double m00;
  77.         double m01;
  78.         double m02;
  79.         double m10;
  80.         double m11;
  81.         double m12;
  82.         double m20;
  83.         double m21;
  84.         double m22;
  85.  
  86.         Matrix3D(double m00, double m01, double m02, double m10, double m11, double m12, double m20, double m21,
  87.                 double m22) {
  88.             this.m00 = m00;
  89.             this.m01 = m01;
  90.             this.m02 = m02;
  91.             this.m10 = m10;
  92.             this.m11 = m11;
  93.             this.m12 = m12;
  94.             this.m20 = m20;
  95.             this.m21 = m21;
  96.             this.m22 = m22;
  97.         }
  98.  
  99.         Matrix3D(Matrix3D m) {
  100.             this.m00 = m.m00;
  101.             this.m01 = m.m01;
  102.             this.m02 = m.m02;
  103.             this.m10 = m.m10;
  104.             this.m11 = m.m11;
  105.             this.m12 = m.m12;
  106.             this.m20 = m.m20;
  107.             this.m21 = m.m21;
  108.             this.m22 = m.m22;
  109.         }
  110.  
  111.         void invert() {
  112.             double invDet = 1.0 / determinant();
  113.             double nm00 = m22 * m11 - m21 * m12;
  114.             double nm01 = -(m22 * m01 - m21 * m02);
  115.             double nm02 = m12 * m01 - m11 * m02;
  116.             double nm10 = -(m22 * m10 - m20 * m12);
  117.             double nm11 = m22 * m00 - m20 * m02;
  118.             double nm12 = -(m12 * m00 - m10 * m02);
  119.             double nm20 = m21 * m10 - m20 * m11;
  120.             double nm21 = -(m21 * m00 - m20 * m01);
  121.             double nm22 = m11 * m00 - m10 * m01;
  122.             m00 = nm00 * invDet;
  123.             m01 = nm01 * invDet;
  124.             m02 = nm02 * invDet;
  125.             m10 = nm10 * invDet;
  126.             m11 = nm11 * invDet;
  127.             m12 = nm12 * invDet;
  128.             m20 = nm20 * invDet;
  129.             m21 = nm21 * invDet;
  130.             m22 = nm22 * invDet;
  131.         }
  132.  
  133.         double determinant() {
  134.             return m00 * (m11 * m22 - m12 * m21) + m01 * (m12 * m20 - m10 * m22) + m02 * (m10 * m21 - m11 * m20);
  135.         }
  136.  
  137.         final void mul(double factor) {
  138.             m00 *= factor;
  139.             m01 *= factor;
  140.             m02 *= factor;
  141.  
  142.             m10 *= factor;
  143.             m11 *= factor;
  144.             m12 *= factor;
  145.  
  146.             m20 *= factor;
  147.             m21 *= factor;
  148.             m22 *= factor;
  149.         }
  150.  
  151.         void transform(Point3D p) {
  152.             double x = m00 * p.x + m01 * p.y + m02 * p.z;
  153.             double y = m10 * p.x + m11 * p.y + m12 * p.z;
  154.             double z = m20 * p.x + m21 * p.y + m22 * p.z;
  155.             p.x = x;
  156.             p.y = y;
  157.             p.z = z;
  158.         }
  159.  
  160.         void transform(Point2D pp) {
  161.             Point3D p = new Point3D(pp.getX(), pp.getY(), 1.0);
  162.             transform(p);
  163.             pp.setLocation(p.x / p.z, p.y / p.z);
  164.         }
  165.  
  166.         void mul(Matrix3D m) {
  167.             double nm00 = m00 * m.m00 + m01 * m.m10 + m02 * m.m20;
  168.             double nm01 = m00 * m.m01 + m01 * m.m11 + m02 * m.m21;
  169.             double nm02 = m00 * m.m02 + m01 * m.m12 + m02 * m.m22;
  170.  
  171.             double nm10 = m10 * m.m00 + m11 * m.m10 + m12 * m.m20;
  172.             double nm11 = m10 * m.m01 + m11 * m.m11 + m12 * m.m21;
  173.             double nm12 = m10 * m.m02 + m11 * m.m12 + m12 * m.m22;
  174.  
  175.             double nm20 = m20 * m.m00 + m21 * m.m10 + m22 * m.m20;
  176.             double nm21 = m20 * m.m01 + m21 * m.m11 + m22 * m.m21;
  177.             double nm22 = m20 * m.m02 + m21 * m.m12 + m22 * m.m22;
  178.  
  179.             m00 = nm00;
  180.             m01 = nm01;
  181.             m02 = nm02;
  182.             m10 = nm10;
  183.             m11 = nm11;
  184.             m12 = nm12;
  185.             m20 = nm20;
  186.             m21 = nm21;
  187.             m22 = nm22;
  188.         }
  189.     }
  190. }
Advertisement
Add Comment
Please, Sign In to add comment