Пример #1
0
        /// <summary>
        /// Creates an AffineTransformation defined by a pair of control vectors. A
        /// control vector consists of a source point and a destination point, which is
        /// the image of the source point under the desired transformation. The
        /// computed transformation is a combination of one or more of a uniform scale,
        /// a rotation, and a translation (i.e. there is no shear component and no
        /// reflection)
        /// </summary>
        /// <param name="src0"></param>
        /// <param name="src1"></param>
        /// <param name="dest0"></param>
        /// <param name="dest1"></param>
        /// <returns>The computed transformation</returns>
        /// <returns><c>null</c> if the control vectors do not determine a well-defined transformation</returns>
        public static AffineTransformation CreateFromControlVectors(Coordinate src0,
                                                                    Coordinate src1, Coordinate dest0, Coordinate dest1)
        {
            Coordinate rotPt = new Coordinate(dest1.X - dest0.X, dest1.Y - dest0.Y);

            double ang = AngleUtility.AngleBetweenOriented(src1, src0, rotPt);

            double srcDist  = src1.Distance(src0);
            double destDist = dest1.Distance(dest0);

            if (srcDist == 0.0)
            {
                return(null);
            }

            double scale = destDist / srcDist;

            AffineTransformation trans = AffineTransformation.TranslationInstance(
                -src0.X, -src0.Y);

            trans.Rotate(ang);
            trans.Scale(scale, scale);
            trans.Translate(dest0.X, dest0.Y);
            return(trans);
        }
Пример #2
0
        /// <summary>
        /// Creates an AffineTransformation defined by a maping between two baselines.
        /// The computed transformation consists of:
        /// <list type="Bullet">
        /// <item>a translation from the start point of the source baseline to the start point of the destination baseline,</item>
        /// <item>a rotation through the angle between the baselines about the destination start point,</item>
        /// <item>and a scaling equal to the ratio of the baseline lengths.</item>
        /// </list>
        /// If the source baseline has zero length, an identity transformation is returned.
        /// </summary>
        /// <param name="src0">The start point of the source baseline</param>
        /// <param name="src1">The end point of the source baseline</param>
        /// <param name="dest0">The start point of the destination baseline</param>
        /// <param name="dest1">The end point of the destination baseline</param>
        /// <returns></returns>
        public static AffineTransformation CreateFromBaseLines(
            Coordinate src0, Coordinate src1,
            Coordinate dest0, Coordinate dest1)
        {
            Coordinate rotPt = new Coordinate(src0.X + dest1.X - dest0.X, src0.Y + dest1.Y - dest0.Y);

            double ang = AngleUtility.AngleBetweenOriented(src1, src0, rotPt);

            double srcDist  = src1.Distance(src0);
            double destDist = dest1.Distance(dest0);

            // return identity if transformation would be degenerate
            if (srcDist == 0.0)
            {
                return(new AffineTransformation());
            }

            double scale = destDist / srcDist;

            AffineTransformation trans = AffineTransformation.TranslationInstance(
                -src0.X, -src0.Y);

            trans.Rotate(ang);
            trans.Scale(scale, scale);
            trans.Translate(dest0.X, dest0.Y);
            return(trans);
        }