Пример #1
0
 /// <summary>
 ///     Calcula la transformacion que permite que el rectangulo <c>rec</c> se centre en el punto
 ///     <c>punto</c>.
 /// </summary>
 /// <param name="orig">Rectangulo.</param>
 /// <param name="punto">Posicion.</param>
 public static Matrix3x3d Center(Rectangle2d orig, Point2d punto)
 {
     // Calcula la transformacion.
     return(Matrix3x3dUtils.Translate(
                punto.X - orig.X - orig.DY / 2,
                punto.Y - orig.Y - orig.DY / 2));
 }
Пример #2
0
        /// <summary>
        ///     Calcula la transformacion que permite que el rectangulo <c>orig</c> se ajuste
        ///     al rectangulo <c>dest</c>.
        /// </summary>
        /// <param name="orig">Rectangulo origen.</param>
        /// <param name="dest">Rectangulo destino.</param>
        /// <param name="deformar">Indica si se permiten deformaciones.</param>
        public static Matrix3x3d AdjustTo(Rectangle2d orig, Rectangle2d dest, bool deformar)
        {
            double sx = dest.DX / orig.DX;
            double sy = dest.DY / orig.DY;

            // Calcula la transformacion.
            Matrix3x3d t;

            if (deformar || sx.EpsilonEquals(sy)) // Se puede deformar o las escalas son iguales.
            {
                t = TransformRectangle(
                    orig,
                    new Point2d(dest.X, dest.Y),
                    new Point2d(dest.X + dest.DX, dest.Y),
                    new Point2d(dest.X, dest.Y + dest.DY));
            }
            else if (sx > sy) // Hay mas escala en X que en Y.
            {
                dest = new Rectangle2d(
                    dest.X + (dest.DX - orig.DX * sy) / 2, dest.Y,
                    orig.DX * sy, dest.DY);

                t = TransformRectangle(
                    orig,
                    new Point2d(dest.X, dest.Y),
                    new Point2d(dest.X + dest.DX, dest.Y),
                    new Point2d(dest.X, dest.Y + dest.DY));
            }
            else // Hay mas escala en Y que en X.
            {
                dest = new Rectangle2d(
                    dest.X, dest.Y + (dest.DY - orig.DY * sx) / 2,
                    dest.DX, orig.DY * sx);

                t = TransformRectangle(
                    orig,
                    new Point2d(dest.X, dest.Y),
                    new Point2d(dest.X + dest.DX, dest.Y),
                    new Point2d(dest.X, dest.Y + dest.DY));
            }

            return(t);
        }
Пример #3
0
        /// <summary>
        ///     Crea una transformacion de un rectangulo.
        ///     <code><![CDATA[
        ///                    *
        ///  * po2   * po1     |
        ///   \     /          |
        ///    \   /      ==>  |
        ///     \ /            *--------*
        ///      * po0         recDst
        /// ]]></code>
        /// </summary>
        /// <param name="po0">Punto origen LB.</param>
        /// <param name="po1">Punto origen RB.</param>
        /// <param name="po2">Punto origen LT.</param>
        /// <param name="recDst">Rectangulo destino.</param>
        /// <returns>Transformacion.</returns>
        public static Matrix3x3d TransformRectangle(Point2d po0, Point2d po1, Point2d po2,
                                                    Rectangle2d recDst)
        {
            /*MATRIX m = TransformRectangle(recDst, po0, po1, po2);
             * m.Inv();
             *
             * return m;*/
            Contract.Requires((recDst.DX > 0) && (recDst.DY > 0));

            double m00 = (po1.X - po0.X) / recDst.DX;
            double m10 = (po1.Y - po0.Y) / recDst.DX;
            double m01 = (po2.X - po0.X) / recDst.DY;
            double m11 = (po2.Y - po0.Y) / recDst.DY;

            double det = 1 / (m00 * m11 - m01 * m10);

            return(new Matrix3x3d(
                       m11 * det, -m01 * det, (m01 * ((-m11 * recDst.Y) - m10 * recDst.X + po0.Y) - m11 * ((-m01 * recDst.Y) - m00 * recDst.X + po0.X)) * det,
                       -m10 * det, m00 * det, (m10 * ((-m01 * recDst.Y) - m00 * recDst.X + po0.X) - m00 * ((-m11 * recDst.Y) - m10 * recDst.X + po0.Y)) * det,
                       0, 0, 1));
        }
Пример #4
0
        /// <summary>
        ///     Crea una transformacion de un rectangulo.
        ///     <code><![CDATA[
        ///  *
        ///  |                  * pd2   * pd1
        ///  |            ==>    \     /
        ///  |                    \   /
        ///  *--------*            \ /
        ///  recOrig                * pd0
        /// ]]></code>
        /// </summary>
        /// <param name="recOrig">Rectangulo origen.</param>
        /// <param name="pd0">Punto destino LB.</param>
        /// <param name="pd1">Punto destino RB.</param>
        /// <param name="pd2">Punto destino LT.</param>
        /// <returns>Transformacion.</returns>
        public static Matrix3x3d TransformRectangle(Rectangle2d recOrig,
                                                    Point2d pd0, Point2d pd1, Point2d pd2)
        {
            Contract.Requires((recOrig.DX > 0) && (recOrig.DY > 0));

            double m00 = (pd1.X - pd0.X) / recOrig.DX;
            double m10 = (pd1.Y - pd0.Y) / recOrig.DX;
            double m01 = (pd2.X - pd0.X) / recOrig.DY;
            double m11 = (pd2.Y - pd0.Y) / recOrig.DY;

            /*MATRIX m = new MATRIX(
             *  m00, m01, pd0.X,
             *  m10, m11, pd0.Y,
             *  0, 0, 1);
             * MATRIX m2 = Translate(-recOrig.X, -recOrig.Y);
             * m.Mul(m2);
             *
             * return m;*/
            return(new Matrix3x3d(
                       m00, m01, (-m01 * recOrig.Y) - m00 * recOrig.X + pd0.X,
                       m10, m11, (-m11 * recOrig.Y) - m10 * recOrig.X + pd0.Y,
                       0, 0, 1));
        }
Пример #5
0
        /// <summary>
        ///     Crea una transformacion de un rectangulo.
        ///     <code><![CDATA[
        ///  *
        ///  |                  * p2
        ///  |            ==>   |
        ///  |                  *-----------*
        ///  *--------*         p0          p1
        ///  recOrig
        /// ]]></code>
        /// </summary>
        /// <param name="recOrig">Rectangulo origen.</param>
        /// <param name="recDst">Rectangulo destino.</param>
        /// <returns>Transformacion.</returns>
        public static Matrix3x3d TransformRectangle(Rectangle2d recOrig,
                                                    Rectangle2d recDst)
        {
            Contract.Requires((recOrig.DX > 0) && (recOrig.DY > 0));

            double m00 = recDst.DX / recOrig.DX;
            double m10 = 0;
            double m01 = 0;
            double m11 = recDst.DY / recOrig.DY;

            /*MATRIX m = new MATRIX(
             *  m00, m01, recDst.Origen.X,
             *  m10, m11, recDst.Origen.Y,
             *  0, 0, 1);
             * MATRIX m2 = Translate(-recOrig.X, -recOrig.Y);
             * m.Mul(m2);
             *
             * return m;*/
            return(new Matrix3x3d(
                       m00, m01, (-m01 * recOrig.Y) - m00 * recOrig.X + recDst.X,
                       m10, m11, (-m11 * recOrig.Y) - m10 * recOrig.X + recDst.Y,
                       0, 0, 1));
        }